c - read() 系统调用不返回 EOF

标签 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];
 }
}

最佳答案

read(2)不返回 EOF。它的返回值是:到达“文件末尾”时为 0,出错时为 -1,读取的字节数为正值。此外,您正在检查 EOF 的数据。你的循环条件是错误的。

通常,您还会检查 read(2) 是否被中断,如果是,则重试。

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

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

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

关于c - read() 系统调用不返回 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831506/

相关文章:

c - 有没有办法根据 t 确定数组的大小

c - 确定是否在 Unix 上安装了 C 库

bash - 如何在 Bash 脚本中以 kb、mb、gb、b 为单位计算实际值

java - 这个值 "20150716203621.000Z"的时间格式的技术术语是什么?

消费者生产者代码未声明的错误linux调试

c - read() 和 fread() 有什么区别?

c - 缺少 kernel32.dll 的依赖项

c++ - 将 USB 数据重定向到以太网/TCP/IP 端口

linux - 在执行期间更改环境变量值

c - 令人困惑的行为,malloc 和 free(),以及 libuv