2013-05-02 86 views
0

所以,我有如下代码:变量不更新从istringstream

#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 

很显然,这不是我想要的东西没有人有答案,这是怎么回事的。 ?

回答

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)

+0

添加istringstream内循环的伎俩。使用in.seekg(0);没有。 – 2013-05-02 20:09:42

+0

为什么不简单地调用'clear()'而不是'str(std :: string())'? – 2013-05-02 21:52:01

+0

@vlad由于清除重置错误标志,而不是stringstream的内容。 – 2013-05-02 22:46:12

0

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

#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; 
} 
+0

其实这并没有工作。我仍然得到相同的输出。 – 2013-05-02 20:06:37

+0

@HadenPike我编辑它以包含完整的代码。它适用于我的电脑 - 可能是某种编译器的区别? – nullptr 2013-05-02 20:09:14

+0

Visual C++ 2010。 – 2013-05-02 22:50:11