E.g。你有一个3行数百万字符的文件。 读取第2行的前N个字符的最快/最有效的方法是什么?
答案 0 :(得分:3)
没有好办法。行结尾只是您必须扫描文件的另一个字符组合。可以对如何读取文件进行一些性能调整,例如使用内存映射。
如果文件在读取之间没有变化,则创建包含换行符位置的单独索引文件将在下次保存扫描时间。如果您可以控制文件写入,则可以在编写文件时创建索引(在单独的文件中或在标题中)。
乔尔在这个问题上写了blog post。
答案 1 :(得分:3)
要么你对断线的位置有所了解......
...或者你完全处于黑暗之中,只需扫描你的路,直到找到第一个换行符:
madvise()
- http://linux.die.net/man/2/madvise)答案 2 :(得分:2)
使用ifstream::ignore()
。
#include <iostream>
#include <fstream>
#include <limits>
using namespace std;
int main(int, char* []) {
ifstream file("file.txt");
// skip first line
file.ignore(numeric_limits<streamsize>::max(), '\n');
// print next N characters
const int N = 15;
char s[N];
file.get(s, N);
cout << s << "\n";
return 0;
}
答案 3 :(得分:1)
读完第1行的所有字符后?
开玩笑......如何将读取大小与文件系统的块大小相匹配。你仍然需要寻找第一行,但这将是最有效的方法
如果您知道第一行的实际长度,您可以在不读取数据的情况下寻找它。
答案 4 :(得分:1)
我认为查找然后通过char读取char是好的,如果你知道你的行的下限,寻找那个界限然后开始读到下一行(对于3行文件的第2行)。