【问题标题】:How can we detect SUB character in a file?我们如何检测文件中的 SUB 字符?
【发布时间】: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,但将其定义为负数。

标签: c string


【解决方案1】:

以二进制模式打开文件。

...fopen("filename", "rb")...

不要忘记库代码不再以二进制模式翻译“换行符”。如果文件的结尾行有"\r\n" 对,则在读取文件时您将同时获得'\r''\n'

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2016-12-10
    • 1970-01-01
    • 2021-02-17
    • 2012-07-31
    • 2011-05-30
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多