【问题标题】:reading from a text file: strange "\x01\0\0\0" sequences从文本文件中读取:奇怪的“\x01\0\0\0”序列
【发布时间】:2012-03-22 04:14:56
【问题描述】:

我已经为这个问题苦苦挣扎了一个星期,距离解决方案还很远。

我正在通过字符串从文件中读取纯文本。它成功读取所有内容,直到一个字符具有一定的大数字。 这个数字对于每个文件是特定的,并且对于不同的文件是不同的。

到达这个大数字的字符后,它会读取“\x01\0\0\0”序列(由4个字符组成)一次或多次而不是原始字符,然后正确读取所有内容(直到下一个大数)。

简而言之 - 而不是读这个:

... many characters ...
First read failure!
... many characters ...
Second read failure, second read failure!
... many characters ...
etc.

它是这样写的:

... many characters ...
First read f\x01\0\0\0re
... many characters ...
Second read failu\x01\0\0\0\x01\0\0\0\x01\0\0\0ead failure!
... many characters ...
etc.

你对这个问题的原因有什么想法吗?

附加信息:

 1) The "ferror" condition is not true.
 2) I am reading from file using streams (fopen, fread, fclose)
 3) Have tested different read methods: "fread cycle" and "fgets".
    The results are the same.
 4) The binary optimization is disabled in the compiler's settings.
    It seams that the problem is not connected with a compiler.
    Neither GCC, nor Apple LLVM gives me the desired result.
 5) Attempting to solve the issue, I converted the whole project from C++ to C,
    but the problem doesn't disappear.

【问题讨论】:

  • 这可能是硬件故障,或者程序中的错误(可能是一些缓冲区溢出)。您确定磁盘状况良好吗? (最近是否通过fsck 或类似方法检查过文件系统?)您是否通过编辑器检查您的文本文件是否包含您认为的内容?文本文件是如何产生的?或者该文件的生产者可能有问题。或者可能是系统配置错误问题(字符编码......)。您是否使用valgrind 运行您的程序?
  • 如果您在这里需要帮助,您真的应该向我们展示代码...您使用调试器了吗??
  • 您确定这些字符不在文件中吗?当它们作为文本查看时,它们可能不会出现,因为它们是不可打印的。
  • 您是否使用valgrind 检查读取器和写入器是否存在缓冲区溢出?但要获得真正的帮助,您应该向我们展示真实的源代码。
  • 你用十六进制编辑器检查过文本文件是否真的应该是这样的吗?

标签: c xcode file text stream


【解决方案1】:

正如我在 cmets 中所建议的:

  • 您应该将源代码放在问题中(您可以随时对其进行编辑以改进它),而不是在 cmets 中
  • 您应该在您的 FILE* 上使用 POSIX 2008 getline 函数。
  • 你应该 free 缓冲区隐式 malloc-ed by getline 稍后,例如当fclose-ing 你的FILE* 句柄时。
  • 你应该学会使用像gdb这样的调试器
  • 你应该学会使用像valgrind这样的内存泄漏检测器

【讨论】:

    【解决方案2】:

    fread() 不一定 NUL 终止输入。如果要将输入视为字符串,则需要检查返回值并自行终止字符串

    chk = fread(input, <WHATEVER>);
    if (chk > 0) {
        input[chk] = 0; /* terminate input */
        /* WHATEVER */
    }
    

    【讨论】:

    • fread 循环检查 NULL 字符以及 EOL 和 EOF。
    • 循环如何测试东西?我认为您正在使用带有一些非字符串数据的字符串函数。
    • 这里是代码:int readline(FILE *in, char * buf) { char c; buf[0]='\0'; for (int i=0; i&lt;BUFSIZ-1; i++) { fread(&amp;c,1,1,in); if (ferror(in)) return 1; if (feof(in)) break; buf[i]=c; if (c=='\x01') { c='\x01'; // &lt;------- breakpoint here } if (c=='\n') break; } if (buf[BUFSIZ-1]!='\0') return 1; return 0; }
    • 问题是即使我用一个简单的 fgets 替换整个函数体,它仍然读取不正确。只有 getline c 函数读取正确。
    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2023-03-13
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多