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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用open()系统调用打开第二个文件相关的知识,希望对你有一定的参考价值。

我正在尝试读取一个文件,将其内容保存在两个数组中(一个用于配对,另一个用于奇数元素),然后将我的两个数组的内容写入两个不同的文件中。我正在使用带有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
");
            return 1;
    }


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

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


    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: 
");
    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
");
                    close(archivoPares);
                    archivoNones = open("archivoNones.txt", O_WRONLY | O_APPEND);
                    write(archivoNones, nones, 6);
                    printf("Nones escrito
");
                    close(archivoNones);  
                    break;
            case 2:
                    read("archivosNones.txt", mostrar, sizeof(mostrar));
                    printf("los pares son %s
", 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("
Exit
");
                    break;
            default:
                    printf("Error in input
");
                    break;
    }

}
答案

unistd.h

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

#include <unistd.h>

Issues with read()

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

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

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

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


Issues with write()

write()系统调用期望void *(即:任何指针类型将执行)作为第二个参数,但是你传递pares[0]pares[par]nones[non],它们是char类型。你必须传递他们的地址,即:&pares[0]&pares[par]&nones[non],它们是char *类型(它们将转换为void *)。

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


Issues with open()

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

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
");
    close(archivoPares);
    archivoNones = open("archivoNones.txt", O_WRONLY | O_CREAT, 0640);
    write(archivoNones, nones, 5);
    printf("Nones escrito
");
    close(archivoNones);  
    break;
case 2:
    archivoNones = open("archivoNones.txt", O_RDONLY);
    read(archivoNones, mostrar, sizeof(mostrar));
    printf("los pares son %s
", mostrar);
    break;
case 3:
    archivoNones = open("archivoNones.txt", O_RDONLY);
    read(archivoNones, mostrar, sizeof(mostrar));
    break;

以上是关于无法使用open()系统调用打开第二个文件的主要内容,如果未能解决你的问题,请参考以下文章

第一个片段替换为第二个片段后,如何打开导航抽屉

无法更新 View Pager 中的中间片段。

ShellExecute无法打开文件夹

想要使用 SharePreferences 更新第二个片段中的数据,但第二个片段没有更新

如果文件不是以sudo方式打开,系统调用open C不能打印文件内容

方向更改后片段中的 getActivity() 为空