快速查找文件中的位置
Quickly seek a location in a file
我有一个文件,里面有很多数字,每个数字都用一个空格隔开。
例如:124 1212 5 654 74231。。。
如何快速定位此文件中的第N个数字?
我认为fseek()
可能不起作用,因为它是以字节为单位测量的,我可以通过获得第N个数字
int i;
for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable);
但我想可能有更有效的方法?
读取整个文件一次,并创建文件中某些数据点的索引(例如1000点)。索引中的每个条目都可以将文件中的位置映射到从该位置开始的第N个数字。建立索引后,每次查找第N个数字时,首先在索引中找到最接近的条目,该条目告诉您可以fseek
访问的文件中最接近的已知点。然后使用fscanf
执行搜索以查找值。这减少了搜索时间,同时为索引使用了一些内存。
索引中的条目可能看起来像:(文件偏移量,编号N)
索引可能看起来像:(文件偏移量1,编号1)(文件偏移量2,编号2)。。。(文件偏移量N,编号N)
如果您创建了文件,那么另外两个选项是:
-
将每个数字打印在一个固定宽度的字段中,该字段足够宽以容纳最大的数字(例如"%5d"),然后
fseek(somefile,(N-1)*6,SEEK_SET)
定位到数字N。 -
如果文件不需要人类可读,您可以将整数
fwrite()
作为二进制数据而不是ASCII字符写入文件,并使用访问它们fseek(somefile,(N-1)*sizeof(int),SEEK_SET) fread(&variable,sizeof(int),1,somefile)
相关文章:
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 将文件复制到自定义位置,存在字符串转换问题
- 奇怪的Arduino C++编译错误取决于文件位置
- 在 elf 文件中查找全局变量的位置
- 可以将Boost消息队列文件重定向到用户指定的位置
- 您如何确定 MySQLCPPConn 库文件的位置?
- 当文件位于正确位置时,ifstream无法打开该文件
- 是否可以将要"ShellExecute"的文件包含在 dll 中?如果是这样,"ShellExecute"中的文件位置应该是什么?
- 在位置上运行具有依赖项的.exe文件
- 快速访问 ifs() C++中的文件位置
- 在C++头文件中放置 using 指令的位置
- 放置 std_lib_facilities.h 头文件的位置
- 如何使用向量 c++ 迭代文件中单词的位置
- 在动态加载的位置无关的可执行文件中分离错误
- 如何选择文件保存到的位置?
- 快速从文件中读取下一个字符串,而无需移动文件的位置
- 将cout引用到一个变量位置(文件或cmd)