我有一个很大但按字典顺序排序的文本文件,在该文件中,我需要尽快找到条目。为了不遍历特定条目的整个内容,我存储了某些关键位置,例如a-> 0,b-> 4092等,其中字符是其自身的首次出现,数字是其位置,这是通过使用getline()一次解析整个文件并将每个字符串的长度添加到一个计数变量中而获得的。目标是,我可以使用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以清除故障标志。我做到了,现在至少以后的调用会产生一些效果。这告诉我,显然在调用txtFile.seekg(pos1, txtFile.beg);时出现错误,但它不是文件结尾。

编辑2:我刚刚检查过,故障位是在没有得到任何东西的getline调用之后设置的。

最佳答案

不好,我在错误的一端搜索了错误。我的问题不是seekg,而是getline中使用ifstream而不是char[]string函数,这令我感到惊讶。如果选择的数组太小,但尚未找到确定字符,则会发生不良情况。

通过确保数组大小与需要的大小相同,或通过使用getline调用全局string,可以避免此问题。

10-06 14:29