我有一个非常大但按字典顺序排列的文本文件,我需要尽快找到条目。为了不遍历特定条目的整个事物,我存储了某些关键位置,例如 - >> 0,b - > 4092等,其中字符是其自身的第一次出现,并且数字是它的位置,通过使用getline()解析整个文件并将每个字符串的长度添加到count-variable中获得。目标是,我可以使用seekg(pos)跳过文件来稍微本地化搜索。它似乎也有效,但有时却没有,我来这里问为什么。相关代码或多或少看起来像这样:
long pos1 = 10800;
long pos2 = 99725;
ifstream txtFile("path/data.txt");
char temp[200];
txtFile.seekg(pos1, txtFile.beg);
txtFile.getline(temp, 100);
txtFile.getline(temp, 100);
cout << tmp << endl;
txtFile.seekg(pos2, txtFile.beg);
txtFile.getline(temp, 100);
txtFile.getline(temp, 100);
cout << tmp << endl;
第二个getline是为了防止流跳到一行的末尾。 在第一种情况下,没有输出。只是一个空字符串。在第二种情况下,输出是文本文件中的法线。文件本身不包含空行。
我有点不知所措。首先,我认为fpos数据类型(在seekg中使用)可能非常小,无法处理大于~10,000的数字,但后来我碰巧从99.000范围获得了有效的查找。有没有人遇到类似的问题?
编辑:我刚刚找到问题的可能原因。在处理seekg的另一个线程中,建议重新打开ifstream以清除failflags。我做到了,现在至少后续的电话会产生一些东西。这告诉我,调用txtFile.seekg(pos1, txtFile.beg);
时显然出现了问题,但它不是文件的结尾。
编辑2:我刚刚检查过,在getline调用之后设置了failbit,但没有得到任何东西。
答案 0 :(得分:1)
我的不好,我在错误的一端搜索错误。我的问题不是seekg
,getline
使用ifstream
而不是char[]
的{{1}}函数,这对我来说是一个惊喜。如果选择的阵列太小而且还没有发现消除字符,则会发生不好的事情。
通过确保数组尽可能大,或使用string
调用全局getline
,可以避免此问题。