C使用fread读取未知数量的数据

时间:2011-12-11 02:05:50

标签: c stdio fread printf

我有一个名为test.txt的文本文件

里面会是一个数字,可能如下:

1
2391
32131231
3123121412

即它可以是任意大小的数字,从1位到x位。

该文件中只有1个东西 - 这个号码。我想要一些使用fread的代码,它将从文件中读取该字节数并将其放入适当大小的变量中。

有人能建议解决这个问题的最佳方法吗?

4 个答案:

答案 0 :(得分:4)

您可以简单地使用:

char buffer[4096];
size_t nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp);

if (nbytes == 0)
    ...EOF or other error...
else
    ...process nbytes of data...

或者,换句话说,为自己提供足够大的数据空间以存储任何有效数据,然后记录实际读取到字符串中的数据量。请注意,除非bufferfread()之前包含全部为零或文件包含零字节,否则该字符串不会以空值终止。在使用之前,您不能依赖局部变量归零。

目前尚不清楚如何创建“适当大小的变量”。您可能最终使用动态内存分配(malloc())来提供正确的空间量,然后从函数返回分配的指针。请记住在使用之前检查空值返回(内存不足)。

答案 1 :(得分:1)

实现此目的的一种方法是使用fseek将文件流位置移动到文件末尾:

fseek(file, SEEK_END, SEEK_SET);

然后使用ftell获取文件中光标的位置 - 这将返回以字节为单位的位置,以便您可以使用此值分配适当大的缓冲区,然后将文件读入该缓冲区。

我已经看到警告说这可能并不总是100%准确,但我在几个实例中使用它没有问题 - 我认为这些问题可能取决于某些平台上功能的具体实现。

答案 2 :(得分:1)

如果您想避免过度阅读,fread不是正确的功能。您可能希望fscanf具有%100[0123456789] ...

行的转换说明符

答案 3 :(得分:0)

取决于你需要多少聪明的数字转换...如果你不需要特别聪明和快速,你可以用getc的类型读取它。因此,从一个初始化为0的变量开始。读取一个字符,将变量乘以10并添加新数字。然后重复直到完成。根据需要获取更大尺寸的变量,或者从最大尺寸的变量开始,然后将其复制到完成后适合的最小尺寸。