变量不从istringstream更新

时间:2013-05-02 19:09:06

标签: c++

所以,我有以下代码:

    #include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <cctype>

using namespace std;

int main(int argc, char *argv[])
{
    char c;
    ifstream f("test.txt");
    char n;
    char z;
    char o;
    int output;
    istringstream in;
    string line;
    while (getline(f, line))
    {
        in.str(line);
        do
        {
            c = in.get();
        }
        while (isspace(c));
        in.unget();
        in >> n >> c >> z >> c >> o >> c >> output;
        cout << n << z << o << output << endl;
    in.str(string());
    }
    f.close();
    return 0;
}

并且文件test.txt包含:

    A,B,C,1
B,D,F,1
C,F,E,0
D,B,G,1
E,F,C,0
F,E,D,0
G,F,G,0

文本文件中每一行的格式是“char,char,char,bool”(我忽略了这一行中间可能有空格的事实。)

当我编译并运行此代码时((使用Visual Studio 2010),我得到:

ABC1
ABC1
ABC1
ABC1
ABC1
ABC1
ABC1

显然,这不是我想要的。有没有人对这里发生的事情有答案?

2 个答案:

答案 0 :(得分:1)

快速修复,将istringstream放入循环中以重置输入指示符:

//istringstream in;  ----------+
string line;                   |
while (getline(f, line))       |
{                              |
    istringstream in; <--------+

    in.str(line);
    do
    {
        c = in.get();
    }
    while (isspace(c));
    in.unget();
    in >> n >> c >> z >> c >> o >> c >> output;
    cout << n << z << o << output << endl;
   //in.str(string()); <-------------------- you can remove this line
}
f.close();

如果您没有重置输入指示符,in.get将无法正常工作。或者您只需使用seekg(0)

答案 1 :(得分:0)

当您更改stringstream的内容时,默认情况下它会将位置指针设置为流的末尾:http://www.cplusplus.com/reference/sstream/stringstream/str/。在in.seekg(0);之后添加in.str(line);,它应该有效:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <cctype>

using namespace std;

int main(int argc, char *argv[])
{
    char c;
    ifstream f("test.txt");
    char n;
    char z;
    char o;
    int output;
    istringstream in;
    string line;
    while (getline(f, line))
    {
        in.str(line);
        in.seekg(0);
        do
        {
            c = in.get();
        }
        while (isspace(c));
        in.unget();
        in >> n >> c >> z >> c >> o >> c >> output;
        cout << n << z << o << output << endl;
    in.str(string());
    }
    f.close();
    return 0;
}