fread是否因大文件而失败?

我必须分析一个16 GB的文件。 我正在使用fread()fseek()顺序读取文件。 这可行吗? fread()为这么大的文件工作吗?

你没有提到一种语言,所以我将假设C.

我没有看到任何问题,但fseekftell可能有问题。

这些函数使用long int作为数据类型来保存文件位置,而不是像fpos_t甚至size_t这样的智能。 这意味着它们无法处理超过2 GB的文件,并且肯定会在16 GB文件上失败。

您需要了解平台上有多long int 。 如果它是64位,你没事。 如果是32,则在使用ftell测量距文件开头的距离时可能会出现问题。

考虑使用fgetposfsetpos

谢谢你的回复。 我弄清楚我哪里出错了。 fseek()ftell()不适用于大于4GB的文件。 我使用了_fseeki64()_ftelli64() ,现在工作正常。

如果正确实施,这应该不是问题。 我假设您按顺序表示您正在以离散块的forms查看文件并推进文件指针。

查看http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.html

听起来他和你几乎做了同样的事情。

这取决于你想做什么。 如果你想在内存中读取整个16GB的数据,那么你可能会耗尽内存或应用程序堆空间。

而是通过块读取数据块并对这些块进行处理(完成后可以使用免费资源)。

但是,除了这一切之外,还要决定你想做哪种方法(使用fread()istream等)并做一些测试用例,看看哪种方法更适合你。

如果您使用的是POSIX-ish系统,则需要确保使用64位文件偏移支持构建程序。 POSIX要求(或者至少允许,并且大多数系统强制执行此操作)实现以拒绝对大小不适合off_t文件执行IO操作,即使正在执行的唯一IO是顺序的而没有搜索。

在Linux上,这意味着您需要在gcc命令行上使用-D_FILE_OFFSET_BITS=64