C ++寻求奇怪的行为,限制可能吗?

问题描述 投票:1回答:1

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

c++ search ifstream seekg
1个回答
1
投票

我的坏,我在错误的一端搜索错误。我的问题不是seekg,它是来自getlineifstream函数使用char[]而不是string,这对我来说是一个惊喜。如果选择的阵列太小而且还没有发现消除字符,则会发生不好的事情。

通过确保数组尽可能大,或通过使用getline调用全局string,可以避免这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.