Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C read()系统调用不返回EOF_C_Unix - Fatal编程技术网

C read()系统调用不返回EOF

C read()系统调用不返回EOF,c,unix,C,Unix,我正在尝试使用开放系统调用从文件中读取所有数据。但我很难找出文件的结尾。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++

我正在尝试使用开放系统调用从文件中读取所有数据。但我很难找出文件的结尾。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];
 }
}

缓冲区不保存EOF,它只保存文件读取中的数据

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

缓冲区不保存EOF,它只保存文件读取中的数据

while(bytesread > 0 ){
    i++;
    bytesread = read (fd, &buf[i], 1);
}
不返回EOF。它的返回值是:到达文件末尾时为0,出错时为1,读取尽可能多的字节时为正值。此外,您正在检查EOF的数据。你的循环条件是错误的

通常,您还需要检查read2是否被中断,如果是,请重试

size_t i = 0;
errno = 0;
while (i < sizeof buf && read (fd, &buf[i], 1) >= 0 && errno != EINTR) {
    i++;
    errno = 0;  
 }
我也不明白为什么一次只读取一个字节,这不是很有效。您总是可以读取数据块并检查返回值以了解读取的字节数

注:通常宏EOF也用值-1定义。因此,read2似乎返回EOF,但不要混淆。

不返回EOF。它的返回值是:到达文件末尾时为0,出错时为1,读取尽可能多的字节时为正值。此外,您正在检查EOF的数据。你的循环条件是错误的

通常,您还需要检查read2是否被中断,如果是,请重试

size_t i = 0;
errno = 0;
while (i < sizeof buf && read (fd, &buf[i], 1) >= 0 && errno != EINTR) {
    i++;
    errno = 0;  
 }
我也不明白为什么一次只读取一个字节,这不是很有效。您总是可以读取数据块并检查返回值以了解读取的字节数


注:通常宏EOF也用值-1定义。因此,read2可能会返回EOF,但不要混淆。

您是否也尝试过检查read的返回值,即ByteRead?是的,我也尝试过。我希望读取调用在读取文件中的所有数据后返回-1,但在所有后续调用中返回0。是否也尝试检查读取的返回值,即bytesread?是的,我也尝试过。我希望读取调用在读取文件中的所有数据后返回-1,但在所有后续调用中返回0。我考虑过这种可能性,但后来决定不这样做。可能我错了,但我认为读调用成功后,仍然可能不会读取任何数据,而读取指针不在文件的末尾。我知道读调用是阻塞的,但它是否可以是非阻塞的,如果是,在这种情况下会有什么不同。返回零不是错误条件。它仅表示它已达到EOF,负数是错误条件。如果它未读取任何数据,则表示EOF已达到,这不是错误,表示读取调用成功,但由于EOF而未读取任何数据。是的,读电话被阻塞了。我考虑过这种可能性,但后来决定反对。可能我错了,但我认为读调用成功后,仍然可能不会读取任何数据,而读取指针不在文件的末尾。我知道读调用是阻塞的,但它是否可以是非阻塞的,如果是,在这种情况下会有什么不同。返回零不是错误条件。它仅表示它已达到EOF,负数是错误条件。如果它未读取任何数据,则表示EOF已达到,这不是错误,表示读取调用成功,但由于EOF而未读取任何数据。是的,读取调用被阻塞。