read()系统调用不返回EOF

时间:2018-10-16 08:49:57

标签: c unix

我正在尝试使用open()系统调用从文件中读取所有数据。但是我很难弄清文件的结尾。 C EOF标志无效。我的程序陷入无限循环。这是代码。该文件少于100个字符。

int main()
{
 char buf[100] = {""};
 i = 0;
 int fd = open ("file1.txt", O_RDONLY);
 int bytesread = read (fd, &buf[i], 1);
 char c = buf[i];
 while (c != EOF) {
    i++;
    int bytesread = read (fd, &buf[i], 1);
    c = buf[i];
 }
}

2 个答案:

答案 0 :(得分:2)

缓冲区不保存EOF,仅保存读取的文件中的数据。您可以做的是

while(bytesread > 0 ){
    i++;
    bytesread = read (fd, &buf[i], 1);
}

答案 1 :(得分:2)

read(2)不返回EOF。它的返回值是:到达“文件尾”时为0,在错误时为-1,在读取了多个字节时为正值。此外,您还要检查EOF的 data 。您的循环条件不正确。

通常,您还需要检查read(2)是否被打断,如果是,请重试。

size_t i = 0;
errno = 0;
while (i < sizeof buf && read (fd, &buf[i], 1) >= 0 && errno != EINTR) {
    i++;
    errno = 0;  
 }

我也不是为什么您一次只读取一个字节,这不是很有效。您总是可以读取数据块并检查返回值以了解读取的字节数。

注意:通常,宏EOF也定义为值-1。因此它可以似乎 read(2)返回EOF,但不要混淆。