1

我有一个非常大但按字典顺序排列的文本文件,我需要在其中尽快找到条目。为了不遍历特定条目的整个内容,我存储了某些关键位置,例如 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 调用之后设置了失败位,但没有得到任何东西。

4

1 回答 1

1

我的错,我在错误的一端搜索了错误。我的问题不是seekg,而是使用而不是 的getline功能,这让我感到惊讶。如果数组选择得太小,而分隔符还没有找到,就会发生不好的事情。ifstreamchar[]string

可以通过确保数组尽可能大或通过调用全局getlinewith来避免该问题string

于 2013-08-02T10:32:05.030 回答