【问题标题】:Using istream::peek() to compare next value against current value使用 istream::peek() 将下一个值与当前值进行比较
【发布时间】:2015-09-19 08:33:24
【问题描述】:

为什么当下一个值为 50 时我的 peek() 条件不返回 FALSE?

当我的代码从文件中读入 40 并比较 50 是否小于 40 时,它返回 TRUE。这显然是错误的,并按照我的子文件中数字出现的顺序创建了一个错误。

while (fin_dataFile >> value) //fin_dataFile is type ifstream reading the original data
    {
        // write the int stored in value to the second sub file
        // fout_splitFile2 is type ofstream
        fout_splitFile2 << value << " ";

        // if the next value in the original data set is less than the current value
        // that was read, break the loop so we can read in that next value to store it
        // in the first sub file instead 
        if (fin_dataFile.peek() < value)
        {
            break;
        }
    }

我输入了一个 temp int 来告诉我 fin_dataFile.peek() 返回了什么,我一直得到 32。这是空格的 ascii 值。有意义,因为每个数字都是空格分隔的。我尝试使用以下方法解决此问题:

if ((fin_dataFile >> std::ws).peek() < value)

但是 peek() 仍然返回与文本文件中不同的数字。

背景:

我正在研究外部自然归并排序。我的拆分功能没有正确拆分数据。它应该读入一个空格分隔的数字文件,并将它们分成两个子文件的子排序数据。 确实如此,但顺序不正确。

我的算法通过使用 peek() 将主文件中的下一个数字与已读入的当前数字进行比较来划分文件之间的数字。

这是要拆分的数据的示例文本文件:

75 55 15 20 85 30 35 10 60 40 50 25 45 80 70 65

【问题讨论】:

  • 您确定将数字文本转换为可以进行计算的实数吗?
  • 既然 value 是 int 类型,编译器不是将数字读取为 int 而不是 chars 吗?通过调试器,每次我读入一个值时,值本身似乎都保持正确的值。
  • peek() 返回存储为整数的下一个字符。窄字符流只有一个字节的数据。我认为这是你的误解。
  • 自从我使用 c++ 流以来已经有一段时间了,但我认为它将它们读取为文本而不是整数。
  • 好吧,这是有道理的。我想象 peek() 的工作方式类似于提取运算符。我已经有一段时间没有使用它了。那么我需要一种方法来向前看两个字符以跳过空格...谷歌搜索一种可能性,我正在阅读有关 seekg() 以查看是否可行...

标签: c++ comparison mergesort istream peek


【解决方案1】:

peek() 窥视文件中的下一个字符

在您的情况下,文件中“40”之后的下一个字符是空格字符、ASCII 空格或 32,小于 40。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多