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