2010-09-13 151 views
1

我想从文件中读取一些数据,数据在不同的时间会有不同的大小。fread()大小参数

如果我使用下面的代码,然后:

char dataStr[256]; 

fread(dataStr, strlen(dataStr), 1, dFd); 

fread是上述调用返回0,而不是从文件中读取任何东西。

但是,如果我给大小1,那么它成功地从文件中读取一个char

当我们不知道文件中数据的大小是多少时,fread()函数的size参数的值应该是多少?

回答

1

你应该使用:

fread(dataStr, 1, sizeof dataStr, dFd); 

,表明你想读等于你的数据缓冲区的大小的字节数。

之所以你的代码不工作是strlen()找到NULL结尾的字符串的长度,缓冲的不是规模。在你的情况下,你在一个未初始化的缓冲区上运行它,只是很幸运,缓冲区中的第一个字节是NULL,所以strlen(dataStr)返回0,但是很可能会崩溃或返回一些大于缓冲区大小的随机数。

还要注意的是fread()返回项目读,而不是(我换了第二个和第三个参数,以便每个字符等同于一个项目)字符的数目。

3

strlen计数的字符数,直到它击中\ 0。
在这种情况下,你可能在第一个字符打\ 0因此strlen返回0作为长度并没有什么阅读。

您使用前人的精力,而不是sizeofstrlen

2

你不能做到这一点,很明显。

你可以阅读到已知的分隔符,常换行,用fgets()读取线。或者,您可以使用该参数读取已知的字节数。

当然,如果数据量有上限,您可以随时阅读,然后以某种方式检查数据以查看所得数据。

另外,在您的示例中,您将对要被覆盖的参数使用strlen(),这意味着它已包含与将要读取的数据完全相同大小的正确字符串。这似乎不太可能,你可能意思是sizeof dataStr那里。

-2

fread返回成功排出的麻木块的数量。 您可以:

if(1==fread(dataStr, 256, 1, dFd)) 
    puts("OK"); 

它曾经读您定义的数据的全长; fread无法打破'\ 0'。

+0

我面临的问题是,我不知道文件中数据的大小。 (该文件基本上会有一个数字作为它的内容,所以它可以是8或3445或任何其他数字)。现在发生的事情是它在读取数字后读取了一些垃圾,当我给sizeof作为大小参数时。如何在不知道文件大小的情况下读取确切的数据(在这种情况下是数字)。 – vikas 2010-09-14 11:27:52