我正在尝试打印出文件的内容,但是程序会在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错误。
答案 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);
}