gpt4 book ai didi

c++ - fscanf 没有按预期工作

转载 作者:行者123 更新时间:2023-11-30 02:59:32 25 4
gpt4 key购买 nike

我在 C++ 中使用 fscanf 如下:

这是我的文本文件:

abcd
efgh

“efgh”后没有空格或换行。现在这是我的循环:

FILE* fp;
char eof = 0;
do
{
char str[20];
fscanf(fp, "%s", str);
std::cout<<str<<std::endl;
}
while((eof = fgetc(fp)) != eof)

我期望的输出是:

abcd
efgh

但我得到的实际输出是:

abcd
efgh
efgh

我调试发现在读取“efgh”后读入eof的值是'\n'而不是EOF。环境是linux mint,想知道为什么最后一个字符串总是读2次,请指教

最佳答案

最后一个字符串没有被读取两次。问题是循环的继续测试:

(eof = fgetc(fp)) != eof

这会将 fgetc() 的返回值赋给 eof 并检查它是否不等于 eof。逻辑上很难做到的事情。但是,当文件位于 EOF 时调用 fgetc() 时,它返回 -1。这被转换为 char 以进行赋值,但括号中的子表达式保留值 -1(由于类型提升规则)。将 -1 与 255 或 -127 进行比较(取决于 char 是有符号的还是无符号的)最终终止循环。

第三次循环时,fscanf() 失败并且没有更新 str:这就是为什么同一个值似乎被读取了两次。

要修复它,最直接的技术是:

do {
...
} while (!feof (fp));

但是,在许多操作系统上,feof() 不能很好地与 fscanf() 配合使用,因为直到 fscanf() 失败。一种更可靠的 O/S 抵抗技术是使用

do {
int result = fscanf (fp, ...whatever...);
if (result < 0) // end of file or i/o error?
break;
} while (!feof (fp));

关于c++ - fscanf 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com