C read()系统调用不返回EOF
我正在尝试使用开放系统调用从文件中读取所有数据。但我很难找出文件的结尾。C EOF标志不起作用。我的程序进入无限循环。这是代码。文件中的字符少于100个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++
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而未读取任何数据。是的,读取调用被阻塞。