4

我正在从事一个从 bin 文件中读取数据并处理数据的项目。bin 文件很大,大约 150MB。我正在尝试使用 fseek 来跳过不需要的数据处理。

我想知道fseek的处理时间是否和fread一样。

谢谢!

4

4 回答 4

3

fseek只是重新定位内部文件指针,而fread实际读取数据。所以我想fseek应该比fread

如果您真的很想看看屏幕后面发生了什么,请glibc这里下载并自己检查:)

于 2012-04-12T06:29:04.570 回答
0

如果您正在处理大文件,您是否考虑过读/写的替代方案?您可能会发现 mmap() (UNIX) 或 MapViewOfFile (Windows) 是更合适的选择。以下 UNIX 示例演示如何打开一个文件以读取和计算 ASCII 字符“Q”的出现次数。注意 - 已省略所有错误检查以使示例更短。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>


int main(int argc, char **argv)
{
  int i, fd, len, total;
  char *map, *ptr;

  fd = open("/tmp/mybigfile", O_RDONLY);

  len = lseek(fd, SEEK_END, 0);

  map = (char *)mmap(0, len, PROT_READ, MAP_SHARED, fd, 0);

  total = 0;
  for (i=0; i<len; i++) {
    if (map[i] == 'Q') total++;
  }

  printf("Found %d instances of 'Q'\n");

  munmap(map, len);

  close(fd);
}
于 2012-04-12T09:21:05.003 回答
0

我可能觉得 fseek 可能比 fread 快一点,因为 fseek 将指针位置更改为您提到的新地址空间并且没有发生日期读取。

于 2012-04-12T07:06:34.880 回答
0

我想知道 的处理时间fseek是否与fread.

可能不是,当然,它依赖于实现。

最有可能的是,fseek只会设置一个内存中的“文件指针”而不去磁盘读取任何信息。fread,另一方面,会读取信息。

一个fseek到文件位置 149M 后跟一个 1Mfread可能会比 150 个不同的 1Mfread调用快,除了最后一个之外的所有调用都丢弃。

于 2012-04-12T06:29:08.250 回答