【发布时间】:2014-05-13 13:29:11
【问题描述】:
我最近发现使用fgetc(),fscanf()(C 中用于扫描字符的常用函数)读取 SUB 字符(ASCII code 26)会使两者都将其解释为错误并返回 EOF。我想知道是否有任何方法可以检测 SUB 字符,以便我可以区分文件的“真实”结尾和明显的结尾。
注意:我目前得出的结论是使用扫描错误检测到文件结尾,因为 SUB 字符用于表示错误,任务看起来不可能。但是由于记事本似乎可以正确读取它,因此我期待使用我不熟悉的 C 语言的一些技术。
【问题讨论】:
-
1) 确保将
fgetc()的结果保存为int。 2) SUB aka Ctrl^Z,被 一些 文本文件用来指示文件中的最后一个char。许多文本文件不使用它,而是根本没有更多数据可供读取。 3)真正的文件结束是当fgetc()或fscanf()返回int而不是char,EOF时设置的文件结束条件。 -
@chux(第 3 点)fgetc() 和 fscanf() 的原型是返回 int。那么他们是如何返回 char 的呢?据我所知,文件的错误和真实结尾都使这两个函数都返回-1。
-
同意这两个函数返回
int。将结果保存在int中很重要。您可以找到 许多 SO 弱编码示例,它们执行类似char ch = fgetc(stdin); if (ch == EOF) ...的操作。这两个函数在文件的错误/真实结尾返回EOF,不一定是-1。 C 规范没有将EOF定义为-1,但将其定义为负数。