无法使用 open() 系统调用打开第二个文件

Can't open second file using open() system call

我正在尝试读取一个文件,将其内容保存在两个数组中(一个用于对,另一个用于奇数元素),然后将我的两个数组的内容写入两个不同的文件。我正在使用带有 switch 语句的菜单。第一个选项应该将两个数组的内容写入两个文件,但我在打开需要写入的文件时遇到错误。我可以打开我的第一个文件并将其内容保存在数组中,但似乎无法打开(和写入)其他两个文件。

编辑:我使用 perror 查看错误是什么,它返回:权限被拒绝

#include <stdio.h>
#include <fcntl.h>
int main(){

    char buffer[100];
    int abrir;
    ssize_t bytes;
    int i = 0;

    char pares[5];
    char nones[5];

    int opcion;
    int archivoPares, archivoNones, reconstruido;

    abrir = open("holamundo.txt", O_RDONLY);
    if(abrir == -1){
            printf("Error opening file\n");
            return 1;
    }


    bytes = read(abrir, buffer, sizeof(buffer)); 
    if(bytes == -1){
            printf("Error reading file");
    }

    if((close(abrir))==-1){
            printf("Error closing file\n");
    }


    int par=0,non=-1;
    for(i; i<bytes; i++){
            if(i==0){
                    pares[par]=buffer[i] ;
            }
            else if(i%2 == 0){
                    par++;
                    pares[par]=buffer[i];
            }else{
                    non++;
                    nones[non]=buffer[i];
            }
    }


    printf("Enter an option: \n");
    scanf("%i",&opcion);
    int tamano;
    char mostrar[10];

    switch(opcion){
 case 1:
                  archivoPares = open("archivoPares.txt", O_WRONLY | O_CREAT,0640);
                    printf("Desc : %d",archivoPares);//this gives me -1
                    write(archivoPares, pares, 6);
                    printf("Pares escrito\n");
                    close(archivoPares);
                    archivoNones = open("archivoNones.txt", O_WRONLY | O_APPEND);
                    write(archivoNones, nones, 6);
                    printf("Nones escrito\n");
                    close(archivoNones);  
                    break;
            case 2:
                    read("archivosNones.txt", mostrar, sizeof(mostrar));
                    printf("los pares son %s\n", mostrar);
                    break;
            case 3:
                    read("archivosNones.txt", mostrar, sizeof(mostrar));
                    break;
            case 4:
                    reconstruido = open("reconstruido.txt",  O_WRONLY | O_APPEND);
                    par=0;
                    non=-1;
                    i=0;
                    for(i; i<bytes; i++){
                            if(i==0){
                                    write(reconstruido, pares[0], 1);
                            }
                            else if(i%2 == 0){
                                    par++;
                                    write(reconstruido, pares[par], 1); 
                            }else{
                                    non++;
                                    write(reconstruido, nones[non], 1); 
                            }
                    }
                    close(reconstruido);
                    break;
            case 5:
                    printf("\nExit\n");
                    break;
            default:
                    printf("Error in input\n");
                    break;
    }

}

unistd.h

首先,read()write()的原型都在unistd.h头中,所以需要包含:

#include <unistd.h>

read()

的问题

read() 系统调用需要一个 文件描述符 (即:int)作为第一个参数。但是,您传递的是 文字字符串 。你的意图似乎很明确,在:

read("archivosNones.txt", mostrar, sizeof(mostrar));

您的意思是从文件 arhivosNones.txt.

中读取 sizeof(mostrar) 个字节

为了实现这一点,您需要先通过open()打开该文件,然后将获得的文件描述符传递给read()


write()

的问题

write() 系统调用需要一个 void *(即:任何指针类型都可以)作为第二个参数,但是您传递的是 pares[0]pares[par]nones[non] 属于 char 类型。您必须传递它们的地址,即:&pares[0]&pares[par]&nones[non],类型为 char *(它们将转换为 void *)。

此外,你正在写 6 个字节(即:write() 的第三个参数),但你最多有 5 个字节存储在 paresnones 中,所以它应该是5 而不是。


open()

的问题

如果文件 "archivoNones.txt" 不存在,以下对 open() 的调用将不起作用:

archivoNones = open("archivoNones.txt", O_WRONLY | O_APPEND);

我认为您想要一个与之前的 open() 调用类似的参数化:

archivoPares = open("archivoPares.txt", O_WRONLY | O_CREAT, 0640);

考虑到所有这些,您的代码将如下所示:

case 1:
    archivoPares = open("archivoPares.txt", O_WRONLY | O_CREAT,0640);
    printf("Desc : %d",archivoPares);//this gives me -1
    write(archivoPares, pares, 5);
    printf("Pares escrito\n");
    close(archivoPares);
    archivoNones = open("archivoNones.txt", O_WRONLY | O_CREAT, 0640);
    write(archivoNones, nones, 5);
    printf("Nones escrito\n");
    close(archivoNones);  
    break;
case 2:
    archivoNones = open("archivoNones.txt", O_RDONLY);
    read(archivoNones, mostrar, sizeof(mostrar));
    printf("los pares son %s\n", mostrar);
    break;
case 3:
    archivoNones = open("archivoNones.txt", O_RDONLY);
    read(archivoNones, mostrar, sizeof(mostrar));
    break;