我正在开发一个从bin文件中读取数据并处理数据的项目。 bin文件很大,大约150MB。我试图使用fseek跳过不需要的数据处理。
我想知道fseek的处理时间是否与fread相同。
谢谢!
答案 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);
}