我正在从事一个从 bin 文件中读取数据并处理数据的项目。bin 文件很大,大约 150MB。我正在尝试使用 fseek 来跳过不需要的数据处理。
我想知道fseek的处理时间是否和fread一样。
谢谢!
fseek
只是重新定位内部文件指针,而fread
实际读取数据。所以我想fseek
应该比fread
如果您真的很想看看屏幕后面发生了什么,请glibc
从这里下载并自己检查:)
如果您正在处理大文件,您是否考虑过读/写的替代方案?您可能会发现 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);
}
我可能觉得 fseek 可能比 fread 快一点,因为 fseek 将指针位置更改为您提到的新地址空间并且没有发生日期读取。
我想知道 的处理时间
fseek
是否与fread
.
可能不是,当然,它依赖于实现。
最有可能的是,fseek
只会设置一个内存中的“文件指针”而不去磁盘读取任何信息。fread
,另一方面,会读取信息。
一个fseek
到文件位置 149M 后跟一个 1Mfread
可能会比 150 个不同的 1Mfread
调用快,除了最后一个之外的所有调用都丢弃。