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

时间:2018-03-02 16:14:43

标签: c file unix system-calls

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

编辑:我使用perror来查看错误是什么并且它正在返回:Permission denied

#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;
    }

}

1 个答案:

答案 0 :(得分:3)

unistd.h

首先,read()write()的原型都在unistd.h标题中,因此您需要包含它:

#include <unistd.h>

read()

的问题

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

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

您的意思是从文件sizeof(mostrar)中读取arhivosNones.txt个字节。

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

write()

的问题

write()系统调用期望void *(即:任何指针类型将执行)作为第二个参数,但您正在传递pares[0]pares[par]和{{ 1}}类型nones[non]。您必须传递其地址,即:char&pares[0]&pares[par],其类型为&nones[non](它们将转换为char *)。< / p>

此外,您正在写入6个字节(即:void *的thrid参数),但write()pares中最多存储5个字节,因此应该为5个字节

nones

的问题

如果文件open()不存在,以下对open()的调用无效:

"archivoNones.txt"

我认为您希望对之前的archivoNones = open("archivoNones.txt", O_WRONLY | O_APPEND); 调用进行类似的参数化:

open()

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

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