C 系统调用 open()
C system calls open()
我在使用 open()
时遇到问题。它总是 returns -1
而且我不知道代码有什么问题。
它一直在说:
r1: No such file or directory
但是txt文件和C程序在同一个目录下
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFSIZE 256
char upper(char c);
int main(void){
int fd1, read1, fd2, write2;
char *buffer[BUFFSIZE];
fd1 = open("minuscole.txt", O_RDONLY);
if (fd1 < 0) { perror("r1"); exit(1); }
read1 = read(fd1, buffer, BUFFSIZE);
close(fd1);
printf("%d", read1);
if(fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644) > 0){
write2 = write(fd2, buffer, BUFFSIZE);
}
close(fd2);
return 0;
}
我希望它创建一个名为:"maiuscole.txt"
的文件并写入其中的内容:"minuscole.txt"
.
尽管您说您的输入文件与您的源文件位于同一位置,但这并不意味着您也是来自同一位置的可执行文件 运行。错误消息清楚地表明你不是。
要修复,请确定您的可执行文件来自哪个目录运行,确保您的输入文件位于该目录,并且您有权在该目录创建输出文件。
如评论中所述,您对 fd2
的赋值语句不正确,因为赋值运算符的 precedence 低于比较运算符。为了保持一致性,我建议您更改代码以匹配用于 fd1
的样式。请注意 0
也是一个有效的文件描述符。
fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if(fd2 >= 0){
//...
read
和 write
的第二个参数分别采用 void *
/const void *
,所以它掩盖了你在传递 char *[]
(衰减为 char **
)到这些函数。这不是您的意图,因为 char **
只能存储 sizeof(char *)
字节。您打算存储最多 BUFFERSIZE
个字节。将 buffer
更改为 char
的数组而不是 char *
.
的数组
char buffer[BUFFSIZE];
从输入文件中读取数据后,read
调用的 return 值就是读取的字节数。您应该只将那么多字节写入输出文件,而不是整个缓冲区。
write2 = write(fd2, buffer, read1);
如果只读取了 10 个字节,则缓冲区中前 10 个字节之后的字节未初始化,您不应将它们写入输出。
还有其他情况和错误检查供您考虑。我不会提供所有的解决方案,但你应该考虑一下:
- 您的输入文件可能大于
BUFFSIZE
。
- 即使文件大于
BUFFSIZE
,对 read
的调用也可能 return 小于 BUFFSIZE
。
- 对
write
的调用可能return少于read1
。
最后,关于 close
的注释。您并不是唯一一个忽略 close
的 return 值的人,即使在生产代码中,这也是很常见的事情。但是,检查 close
是否成功仍然是一个好习惯。在某些情况下,它可能会失败,因为描述符之前已经关闭。您可能有兴趣知道是否会发生这种情况,因为它表明程序中存在某种逻辑错误。虽然关闭无效的文件描述符是良性的,但将来您可能会不小心关闭一个正在被程序的其他部分使用的文件描述符。
我在使用 open()
时遇到问题。它总是 returns -1
而且我不知道代码有什么问题。
它一直在说:
r1: No such file or directory
但是txt文件和C程序在同一个目录下
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFSIZE 256
char upper(char c);
int main(void){
int fd1, read1, fd2, write2;
char *buffer[BUFFSIZE];
fd1 = open("minuscole.txt", O_RDONLY);
if (fd1 < 0) { perror("r1"); exit(1); }
read1 = read(fd1, buffer, BUFFSIZE);
close(fd1);
printf("%d", read1);
if(fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644) > 0){
write2 = write(fd2, buffer, BUFFSIZE);
}
close(fd2);
return 0;
}
我希望它创建一个名为:"maiuscole.txt"
的文件并写入其中的内容:"minuscole.txt"
.
尽管您说您的输入文件与您的源文件位于同一位置,但这并不意味着您也是来自同一位置的可执行文件 运行。错误消息清楚地表明你不是。
要修复,请确定您的可执行文件来自哪个目录运行,确保您的输入文件位于该目录,并且您有权在该目录创建输出文件。
如评论中所述,您对 fd2
的赋值语句不正确,因为赋值运算符的 precedence 低于比较运算符。为了保持一致性,我建议您更改代码以匹配用于 fd1
的样式。请注意 0
也是一个有效的文件描述符。
fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if(fd2 >= 0){
//...
read
和 write
的第二个参数分别采用 void *
/const void *
,所以它掩盖了你在传递 char *[]
(衰减为 char **
)到这些函数。这不是您的意图,因为 char **
只能存储 sizeof(char *)
字节。您打算存储最多 BUFFERSIZE
个字节。将 buffer
更改为 char
的数组而不是 char *
.
char buffer[BUFFSIZE];
从输入文件中读取数据后,read
调用的 return 值就是读取的字节数。您应该只将那么多字节写入输出文件,而不是整个缓冲区。
write2 = write(fd2, buffer, read1);
如果只读取了 10 个字节,则缓冲区中前 10 个字节之后的字节未初始化,您不应将它们写入输出。
还有其他情况和错误检查供您考虑。我不会提供所有的解决方案,但你应该考虑一下:
- 您的输入文件可能大于
BUFFSIZE
。 - 即使文件大于
BUFFSIZE
,对read
的调用也可能 return 小于BUFFSIZE
。 - 对
write
的调用可能return少于read1
。
最后,关于 close
的注释。您并不是唯一一个忽略 close
的 return 值的人,即使在生产代码中,这也是很常见的事情。但是,检查 close
是否成功仍然是一个好习惯。在某些情况下,它可能会失败,因为描述符之前已经关闭。您可能有兴趣知道是否会发生这种情况,因为它表明程序中存在某种逻辑错误。虽然关闭无效的文件描述符是良性的,但将来您可能会不小心关闭一个正在被程序的其他部分使用的文件描述符。