通过stringstreams更新int

时间:2015-06-17 07:25:48

标签: c++

我试图从文件中逐行读取一对值,但整数ij没有更新。我对ij的分配是错误的吗?我找到了一种方法来使代码工作,但我很想知道为什么第一个while循环不起作用。

控制台输出:

127 86
127 86

141 127
127 86

153 127
127 86

165 127
127 86

171 127
127 86

174 127
127 86

191 27
127 86

191 87
127 86

191 99
127 86

191 102
127 86

MWE:

#include <fstream>
#include <iostream>
#include <sstream>

using namespace std;

void test()
{
    ifstream inputfile;
    inputfile.open("test.txt");
    string line;
    stringstream lineS;
    int i, j;

    while ( getline( inputfile, line ) )
    {
        lineS.str(line);
        cout << lineS.str() << endl;
        lineS >> i >> j;
        cout << i << " " << j << endl << endl;
    }

    /* This works
    while (!inputfile.eof()) {
        inputfile >> i >> j;
        cout << i << " " << j << endl << endl;
    }*/
    inputfile.close();
}

int main()
{
    test();
    return 0;
}

这是文本文件test.txt:

127 86
141 127
153 127
165 127
171 127
174 127
191 27
191 87
191 99
191 102

2 个答案:

答案 0 :(得分:0)

问题似乎是,当您从lineS读取一次后,eofbit标志已设置,并且在重置字符串时不会清除它。当您重置字符串时,标准库代码中的错误或错误都无法正确重置读取位置。

两个解决方案:每个循环手动clear the stream state,或在循环内定义lineS

答案 1 :(得分:0)

您尚未重置流的指针,指向字符串的开头。您更改了基础字符串并不重要。

更好的习惯用法是在循环中构造字符串流:

while ( getline( inputfile, line ) )
{
  istringstream lineS( line );
  lineS >> i >> j >> ws;
  if (!lineS.eof()) inputfile.setstate( ios::failbit );
}

另请注意,任何输入错误都会被识别并传播回原始输入流。

希望这有帮助。