And*_*nea 2 c linux system-calls
我有麻烦open()。它总是返回-1,我不知道代码出了什么问题。它一直在说:
Run Code Online (Sandbox Code Playgroud)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;
}
Run Code Online (Sandbox Code Playgroud)
我希望它创建一个名为:的文件,"maiuscole.txt"并写入其中的内容:"minuscole.txt"。
尽管您说输入文件与源文件位于同一位置,但这并不意味着您也从同一位置运行可执行文件。该错误消息清楚地表明您不是。
要修复该问题,请确定您从中运行可执行文件的目录,确保输入文件位于此处,并且您有权在此处创建输出文件。
如注释中所述,您的for赋值语句fd2不正确,因为赋值运算符的优先级比比较运算符的优先级低。为了保持一致,建议您更改代码以匹配所使用的样式fd1。请注意,这0也是一个有效的文件描述符。
fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if(fd2 >= 0){
//...
Run Code Online (Sandbox Code Playgroud)
的第二个参数read和write取void */ const void *之中,因此它掩盖错误你有你在哪里传递char *[](其衰减到char **)这些功能。这不是您的意图,因为a char **只能存储sizeof(char *)字节。您打算存储最多BUFFERSIZE字节。更改buffer为char而不是的数组char *。
char buffer[BUFFSIZE];
Run Code Online (Sandbox Code Playgroud)
从输入文件中读取数据后,read调用的返回值是读取了多少字节。您只应将那么多字节写入输出文件,而不是整个缓冲区。
write2 = write(fd2, buffer, read1);
Run Code Online (Sandbox Code Playgroud)
如果仅读取10个字节,则缓冲区中前10个字节之后的字节未初始化,因此不应将其写入输出。
还有其他情况和错误检查供您考虑。我不会提供所有解决方案,但您应该考虑以下几点:
BUFFSIZE。read可能返回小于。BUFFSIZEBUFFSIZEwrite返回的可能少于read1。最后,请注意close。您并不孤单地忽略的返回值close,即使在生产代码中,这也是很常见的事情。但是,检查是否close成功仍然是一种好习惯。在某些情况下,它可能会失败,因为描述符之前已关闭。您可能想知道是否会发生这种情况,因为它表明程序中存在某种逻辑错误。虽然关闭无效的文件描述符是有益的,但将来,您可能会意外关闭该程序的其他部分正在使用的文件描述符。