Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t使用open()系统调用打开第二个文件_C_File_Unix_System Calls - Fatal编程技术网

Can';t使用open()系统调用打开第二个文件

Can';t使用open()系统调用打开第二个文件,c,file,unix,system-calls,C,File,Unix,System Calls,我试图读取一个文件,将其内容保存在两个数组中(一个用于pair,另一个用于奇数元素),然后将两个数组的内容写入两个不同的文件中。我正在使用带有开关语句的菜单。第一个选项应该在两个文件中写入两个数组的内容,但打开需要写入的文件时出错。我可以打开第一个文件并将其内容保存在数组中,但似乎无法打开(并写入)其他两个文件 编辑:我使用perror查看错误是什么,它正在返回:权限被拒绝 #include <stdio.h> #include <fcntl.h> int main(){

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

编辑:我使用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;
    }

}
#包括
#包括
int main(){
字符缓冲区[100];
内塔布里尔;
ssize_t字节;
int i=0;
char-pares[5];
char-nones[5];
国际组织;
内部归档、归档、重建;
abrir=open(“holamundo.txt”,仅限ordu);
如果(abrir==-1){
printf(“打开文件时出错”);
返回1;
}
字节=读取(abrir、缓冲区、sizeof(缓冲区));
如果(字节==-1){
printf(“读取文件时出错”);
}
如果((关闭(abrir))=-1){
printf(“关闭文件时出错\n”);
}
int par=0,non=-1;
对于(i;i
unistd.h
首先,
read()
write()
的原型都在
unistd.h
标题中,因此您需要包含它:

#include <unistd.h>
您的意思是从文件
arhivosNones.txt
中读取
sizeof(mostrar)
字节

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


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

此外,您正在写入6个字节(即
write()
)的第三个参数),但在
pares
nones
中最多存储了5个字节,因此应改为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;

检查
open
的返回值,并使用
perror
找出错误所在。如果您在当前目录中没有写入权限,这就是您将得到的结果。open返回-1,错误为权限被拒绝。是因为我之前创建了文件吗?
archivoPares=open(“archivoPares.txt”,O|WRONLY | O|u CREAT,0640)
。对于第一次运行代码的用户以外的其他用户(当文件不存在时)
read()
int
作为第一个参数@考えネロク 你说得对。直到现在才注意到。应该是文件描述符。谢谢
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;