阅读Posix系统调用

时间:2014-11-23 21:51:09

标签: c posix

我正在尝试打印出文件的内容,但是程序会在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(文件,buff,1024,0),则会抛出非法搜索29错误。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);

你的循环不正确。它假设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);
}