从文本文件中读取错误:奇怪的' \ x01' ' \ 0' ' \ 0' ' 0'序列

时间:2012-02-23 20:09:33

标签: c file text stream fread

我正在从文件中读取纯文本 - 按行,具有以下功能:

int readline(FILE *in, char * buf) {
char c;
buf[0]='\0';
for (int i=0; i<BUFSIZ-1; i++) {
    fread(&c,1,1,in);
    if (ferror(in)) return 1; 
    if (feof(in)) break;
    buf[i]=c; 
    if (c=='\n') break;
    }
    if (buf[BUFSIZ-1]!='\0') return 1;
    return 0;
}

它正确读取28816个字符,然后麻烦就开始了。 而不是阅读接下来的四个字符:

' ' 'f' 'o' 'r'

它读起来很奇怪:

'\x01' '\0' '\0' '\0'

之后,它会正确读取所有内容,直到33080字符。 它不是正确读取接下来的12个字符,而是读取三个序列:

'\x01' '\0' '\0' '\0' '\x01' '\0' '\0' '\0' '\x01' '\0' '\0' '\0'

然后,它再次正确读取所有内容,直到某一点。

当出现此问题时,既没有(ferror(in))也没有(feof(in))条件为真。

您对此问题的原因有什么想法吗?

1 个答案:

答案 0 :(得分:1)

它看起来不像随机数据 - 它是整数值为1的字节序列(假设x86或类似的CPU)。

我希望有两种情况之一:

1)你正在写下缓冲区的末尾,而其他东西正在使用相同的内存

2)程序中的其他地方,你将另一个数组的末尾写入缓冲区使用的内存中。

从评论中,我看到你已经调试了它,似乎排除了两种选择。我想知道在调试时是否禁用了优化?我在过去调试优化二进制文件时遇到了棘手的经验。