无法使用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个字节存储在pares
和nones
中,所以它应该是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()系统调用打开第二个文件的主要内容,如果未能解决你的问题,请参考以下文章
想要使用 SharePreferences 更新第二个片段中的数据,但第二个片段没有更新