C系统调用open()

我在使用open()时遇到麻烦。它总是返回-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,BUFFSIZE);
    }
    close(fd2);

    return 0;
}

我希望它创建一个名为"maiuscole.txt"的文件并写入"minuscole.txt"中的内容。

haoyun1126 回答:C系统调用open()

尽管您说输入文件与源文件位于同一位置,但这并不意味着您也在同一位置运行可执行文件。错误消息清楚地表明您不是。

要解决此问题,请确定从哪个目录运行可执行文件,并确保输入文件位于该目录中,并且您有权在其中创建输出文件。

如注释中所述,您对fd2的赋值语句是错误的,因为赋值运算符的precedence比比较运算符要低。为了保持一致,我建议您更改代码以匹配fd1所使用的样式。请注意,0也是有效的文件描述符。

fd2 = open("maiuscole.txt",O_WRONLY | O_CREAT | O_TRUNC,0644);
if(fd2 >= 0){
    //...

readwrite的第二个参数分别采用void * / const void *,因此它掩盖了传递char *[]时存在的错误(衰减为char **)到这些功能。这不是您的意图,因为char **只能存储sizeof(char *)个字节。您打算最多存储BUFFERSIZE个字节。将buffer更改为char的数组,而不是char *的数组。

char buffer[BUFFSIZE];

从输入文件中读取数据后,read调用的返回值是读取了多少字节。您只应在输出文件中写入那么多字节,而不是整个缓冲区。

    write2 = write(fd2,buffer,read1);

如果仅读取10个字节,则缓冲区中前10个字节之后的字节会被初始化,因此您不应将其写入输出中。

还有其他情况和错误检查供您考虑。我不会提供所有解决方案,但是您应该考虑一下:

  • 您的输入文件可能大于BUFFSIZE
  • 即使文件大于read,对BUFFSIZE的调用返回的值也可能小于BUFFSIZE
  • write的呼叫返回的可能少于read1

最后,关于close的注释。您并不孤单地忽略close的返回值,即使在生产代码中,这也是很常见的事情。但是,检查close是否成功仍然是一个好习惯。在某些情况下,它可能会失败,因为描述符之前已关闭。您可能想知道是否会发生这种情况,因为它表明程序中存在某种逻辑错误。虽然关闭无效的文件描述符是有益的,但将来,您可能会意外关闭该程序的其他部分正在使用的文件描述符。

本文链接:https://www.f2er.com/3142229.html

大家都在问