2017-06-22 94 views
-3

我试图从文件读取数据到缓冲区。文件中的数据是900K字节。 (试图结束文件和ftell())。分配要读取大小为900K + 1的数据的缓冲区(以空终止)。我的问题是,fread()返回900K,但我看到strlen(缓冲区)它显示较小的值,并在缓冲区最后我可以看到像“.....(截断)”的东西。这是为什么? fread()有没有限制,我们无法读入缓冲区,它会截断它。另外为什么fread()的返回值说900K,尽管实际上它读取的更少。是否有使用fread读取的字节限制()

+2

'strlen'无法评估二进制数组的大小。如果数据中有零,则停在那里。如果没有,那么...... boom(未定义行为) –

+0

文件数据中是否有零字节?字符串停在第一个字符串处。 –

+0

文件不是空终止的,它们不一定是文本。不要试图像这样对待他们。 fread()已经读取了比您所看到的更多的字节;文件中明显存在二进制数据,并且数据中的空字符使strlen()认为它已到达结尾。二进制!=文本,二进制数据不能使用像strlen()这样的字符函数来处理。 –

回答

0

您的主要问题有already been answered,但值得注意的是strlen不是用来测量数组的大小,而是用一个以NULL结尾的字符串。它可能会打印一个较低的值,因为strlen返回出现在空字符之前的字符数,因此如果您的数据中有空字符('\ 0'),则strlen会在找到他们。

您应该信赖fread的返回值。

编辑:作为一个说明,的fread可以读取比请求更少的字节,并且可以通过错误或文件的端部引起的。您可以分别使用ferrorfeof进行检查。

+0

好的。我认为不要将它与strlen()进行比较,因为它可能包含二进制数据。但我的这个问题还没有得到解答:为什么数据在缓冲区中出现这样的结果:06/21/17 21:41:21 paper ...“(截断) – user7375520

0

strlen做沿着这些路线的东西:

int strlen(char *str) 
{ 
    int len = 0; 
    while(*str++) len++; 
    return len; 
} 

如果你的文件包含二进制数据(或者如果它是一个UTF编码和未使用的高位字节的文本文件)strlen会停在第一0x00字节它会遇到并返回遇到的文件中的多少个字节。如果你阅读一个像ANSI这样的单字节编码的文本文件,将不会有的空终止符,并且调用strlen将调用未定义的行为。

如果要确定fread成功读取文件的字节数,请检查其返回值。

如果你想读文件前确定文件的大小,这样做:

size_t len; 
fseek(fp, 0, SEEK_END); 
len = ftell(fp); 
rewind(fp); 

len将包含该文件的字节大小。

1:假设您用参数2组称为fread每件1个字节,并没有尝试读取更多的字节比实际上是在文件中。

+0

我的确如此了解文件大小,我也没有把它与strlen()比较,因为它可能包含二进制数据。但是我的这个问题还没有得到解答:为什么缓冲区中的数据如下所示: 06/21/17 21:41:21 paper ...“(截断) – user7375520

相关问题