提问人:sunflower 提问时间:3/18/2023 最后编辑:chqrliesunflower 更新时间:3/18/2023 访问量:181
C语言中文件的feof()函数和EOF有什么区别?
What is the difference between feof() function and EOF of a file in C?
问:
我不明白函数和有什么区别?两者都代表文件的末尾,那么它们有什么不同,我们怎么知道在哪里使用什么?feof()
EOF
在哪里使用该功能以及在哪里使用?feof()
EOF
答:
如果上一个文件操作设置了文件结束标志,则函数返回 TRUE。feof(file)
EOF
是许多文件 I/O 函数返回的整数常量,表示无法从文件/流中读取更多数据。
在哪里使用 feof() 函数以及在哪里使用?
基本上,您可以在 I/O 操作后使用来检查是否设置了文件结束标志(即是否可以从文件/流中读取更多数据)feof(file)
EOF 由许多 I/O 函数返回 - 您需要阅读函数文档。示例 fscanf
评论
EOF
是一个宏,它扩展为具有负值的类型的整数常量表达式int
getchar()
将是一个更好的例子。 最好检查转换正确数量的项目。fscanf()
feof
并在 中定义。EOF
<stdio.h>
EOF
是一个宏,它扩展为具有负值(通常)的整数常量表达式。它与 和 返回的所有有效字节值不同。如果无法从流中读取任何字节,则返回这些函数。返回值必须存储到 a 中,以便进行比较,以便可靠地检测文件末尾。int
-1
getchar()
getc()
fgetc()
EOF
int
EOF
关于,快速的答案是:feof()
永远不要使用
feof(file),
始终检查所有文件读取函数的返回值以检测流的结束:
对于 或 :getchar()
getc()
fgetc()
int c;
while ((c = getchar()) != EOF) {
// handle the byte read from the file
}
// end of file reached
为:fgets()
char buf[100];
if (fgets(buf, sizeof buf, file)) {
// a line was read into buf, or the initial portion of
// the current line if longer than 99 bytes.
} else {
// end of file has been reached.
}
为:fread()
size_t nread = fread(buf, size_of_element, count_of_elements, file);
if (nread > 0) {
// handle the elements read
} else {
// end of file reached
}
对于和:scanf()
fscanf()
int value;
int res = fscanf(file, "%d", &value);
if (res == 1) {
// int value was read from the stream
} else {
// no integer could be read: either input is not an integer or
// end of file was reached.
// read and discard the input line
int c = EOF;
if (res != EOF) {
while ((c = getc(file)) != EOF && c != '\n')
continue;
}
if (c == EOF) {
// end of file reached
} else {
// try and recover from invalid input.
}
}
关于 和 : 读取字符串是一个错误,因为任何足够长的输入都会导致缓冲区溢出,并可能被用作漏洞。建议使用 或 将一行读入数组 和 use 中,以仔细解析其内容,指定要存储到 and 转换的目标数组中的最大字符数:scanf()
fscanf()
%s
fgets()
getline()
char
sscanf()
%s
%[
char line[100];
char player[20];
char eol;
int score;
while (fgets(line, sizeof line, file)) {
if (sscanf(line, "%19s%d%c", player, &score, &eol) != 3 || eol != '\n') {
fprintf(stderr, "invalid input: %s\n", line);
if (!strchr(line, '\n')) {
int c;
while ((c = getc(file)) != EOF && c != '\n')
continue;
if (c == EOF)
break;
}
continue;
}
// handle the player score...
}
// end of file has been reached.
您可能想阅读并理解为什么“while( !feof(file) )”总是错的?.
长答案是:
该函数返回文件结束指示器的值,该指示器可能已由上一个文件读取操作在到达文件末尾时设置。由于应始终测试这些文件读取操作是否成功,因此很少使用此函数,仅用于区分文件读取错误和到达文件末尾。如今,文件读取错误在桌面系统上非常罕见,因此通常不需要这种区分。99% 使用的代码滥用了此函数。
feof()
feof()
评论
feof()
EOF
feof()
EOF
feof()
fread()
EOF
FILE *file = fopen("abc.txt", "w");
EOF
function 和 ... 和有什么不一样?
feof()
EOF
EOF
从各种输入函数返回,以指示:
在没有其他输入的情况下尝试读取时,刚刚发生读取文件结束情况。这将设置流的文件结束标志。
设置了流的文件结束标志,并且未发生读取尝试。
流检测到输入错误,例如尝试从输出流中读取或(很少)某些通信错误。
其他*1.
feof()
报告流的文件结束标志。
在哪里使用该功能以及在哪里使用?
feof()
EOF
观察 的输入函数的返回值,以检测无输入条件。EOF
用于检测输入函数返回 的原因。feof()
EOF
int ch = fgetc(stream);
if (ch == EOF) {
if (feof(stream)) puts("End of file");
else puts("Input error");
}
*1 也会在极少数计算机上返回,其中 和 可以指示有效的输入字符。此处省略了此类机器的详细信息。EOF
sizeof(int) == 1
评论
while ( !feof (file) )
总是错的?它的主要用途是消除文件读取函数失败时的原因。feof()
EOF
是一个值。您可以将事物与此值进行比较。 是一个函数,它返回一个值。您可以调用 ,看看它能给你带来什么价值。feof()
feof()
getchar
EOF
getchar
feof(stdin)