【问题标题】:Read Posix System Call读取 Posix 系统调用
【发布时间】:2014-11-23 21:51:08
【问题描述】:

我正在尝试打印文件的内容,但是程序将在 read() 函数处暂停,并且在我按下回车键之前不会继续。按下回车键后,终端不会打印任何内容。程序的其余部分未显示,但这是导致问题的方法。

{
char buff[1024];
ssize_t bytesRead = 0;
int readFile, error;
if((readFile = open(file,O_RDONLY)<0))
   {
        printf("can't open %s\n",file);
        error = errno;
        return -1;
   }
do{
        memset(buff,0,1024);
        if((bytesRead=read(readFile,buff,1024))==-1)
        {
            printf("error reading file");
            error = errno;
            printf("%d",error);
        }
        else
            printf("%s",buff);
   }while(bytesRead==1024);
   printf("\n");
   close(readFile);
   return 1;
}

或者,如果我将 read() 函数更改为 pread(file,buff,1024,0) 会引发非法 seek 29 错误。

【问题讨论】:

  • 您能否在您的printf("error reading file"); 末尾添加一个\n?没有它,消息可能无法从 printf 行缓冲区中取出,因此您不会看到它出现,这让您想知道发生了什么。
  • 我试过了,但还是没有骰子,谢谢。
  • 天哪。 if((readFile = open(file,O_RDONLY)&lt;0))。这会将readFile 设置为0 或仅1(更可能是0 - 标准输入)。 编辑:)) 之间右击&lt;0。查找错误是因为您无法查找标准输出或标准输入。
  • 你先生太棒了!
  • 从现在开始,把你的赋值语句放在与ifs 不同的行上。我不明白为什么人们试图把这么多东西塞进一行。它更难阅读,并且会导致许多类似错字的错误,例如问题中的错误。教人们使用这种语法的人不应该教。

标签: c posix


【解决方案1】:

除非您从标准输入(标准输入)读取,否则按回车键不会影响读取调用。在这种情况下,您提供的输入 - 空格 - 可能会在 printf("%s", buff); 调用中打印出来。如果您可以包含一些步骤,说明您如何发现这是导致问题的方法,或者您如何发现它在读取行暂停(并且如果您正在阅读/dev/stdin),它可能更容易提供帮助。

因此,如果读取的字节不包含 null 并且 bytesRead 计数为 1024,则相同的 printf 调用可能永远不会返回 - buff 中的字符串不会以 null 终止。您可以通过 buff[1023] = '\0'; 或在 printf 调用中设置长度限制来解决此问题,例如 printf("%.1024s", buff);

【讨论】:

  • 好吧,我将 do while 循环更改为仅包含 memset 和 read() 函数,并且程序的行为仍然相同。而删除 do while 循环消除了这个问题。
【解决方案2】:
do{
        memset(buff,0,1024);
        if((bytesRead=read(readFile,buff,1024))==-1)
        {
            printf("error reading file");
            error = errno;
            printf("%d",error);
        }
        else
            printf("%s",buff);
   }while(bytesRead==1024);

您的循环不正确。它假设read() 填满了缓冲区;如果文件不是 1024 字节的倍数,则失败;它在打印之前损坏了errno;它会进行不必要的memset() 操作。亲爱的,一团糟。它应该是这样的:

while ((bytesRead=read(readFile, buff, sizeof buff)) > 0)
{
    printf("%.*s", bytesRead, buff);
}
if (bytesRead < 0)
{
    error = errno;  
    perror("error reading file");
    printf("errno=%d\n",error);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-02-12
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多