【问题标题】:C++ seekg strange behaviour, limits maybe?C ++寻求奇怪的行为,也许是限制?
【发布时间】:2013-08-03 13:16:27
【问题描述】:

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

【问题讨论】:

  • 您的字节位置或给定行数的 pos1 和 pos2 值是多少?
  • @alexbuisson 字节位置。它是通过计算在该点之前遇到的所有字符来获得的。

标签: c++ search ifstream seekg


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2013-06-24
    相关资源
    最近更新 更多