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