C语言 Using fseek and fread



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

我想知道 fseek 的处理时间是否与 fread 相同。

谢谢!

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

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

我想知道fseek的处理时间是否与fread相同。

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

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

提交位置 149M 的fseek,然后是 1M fread,可能比 150 个不同的 1M fread调用更快,除了最后一个之外,其他所有调用都扔掉了。

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

如果您正在处理大文件,您是否考虑过读/写的替代方案?您可能会发现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);
}

最新更新