使用fseek和fread

时间:2012-04-12 06:25:16

标签: c io fread fseek

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

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

谢谢!

4 个答案:

答案 0 :(得分:3)

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

快得多

如果您真的很想知道屏幕背后发生了什么,请从here下载glibc并自行检查:)

答案 1 :(得分:0)

  

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

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

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

fseek到文件位置149M后跟一个1M fread可能比150个不同的1M fread来电更快,除了最后一个之外全部丢掉。

答案 2 :(得分:0)

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

答案 3 :(得分: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);
}