6

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

4

5 回答 5

6

感谢您的回复。我知道我哪里错了。fseek()并且ftell()不适用于大于 4GB 的文件。我用过_fseeki64()_ftelli64()现在工作正常。

于 2010-09-29T23:00:14.640 回答
6

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

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

这些函数long int用作保存文件位置的数据类型,而不是像fpos_t甚至size_t. 这意味着它们可能无法处理超过 2 GB 的文件,当然也可能无法处理 16 GB 的文件。

你需要看看你的平台有多大long int。如果它是 64 位,那就没问题了。如果它是 32,则在ftell用于测量距文件开头的距离时可能会遇到问题。

考虑使用fgetposandfsetpos代替。

于 2010-09-29T21:35:56.697 回答
3

如果实施得当,这应该不是问题。我假设按顺序你的意思是你正在查看离散块中的文件并推进你的文件指针。

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

听起来他和你做的几乎一样。

于 2010-09-29T21:23:13.007 回答
2

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

而是逐块读取数据并对这些块进行处理(并在完成时释放资源)。

但是,除此之外,请决定您要采用哪种方法(使用fread()oristream等​​)并做一些测试用例,看看哪种方法更适合您。

于 2010-09-29T21:19:54.350 回答
2

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

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

于 2010-09-29T22:56:34.677 回答