stringstream没有按预期工作

时间:2012-09-24 21:51:18

标签: c++ vector stringstream

我正在尝试编写用于解析和处理文本文件的程序。 在没有成功实施 sscanf 后,我决定尝试 stringstream

我有包含由空格分隔的数据的字符串向量,例如:

  

some_string another_string yet_another_string VARIABLE_STRING_NO_1   next_string

我编写了代码,预期结果将是:

Counter: 4
Variable number 1 : VARIABLE_STRING_NO_1
Variable number 2 : VARIABLE_STRING_NO_2
Variable number 3 : VARIABLE_STRING_NO_3
Variable number 4 : VARIABLE_STRING_NO_4

但我得到了:

Counter: 4
Variable number 1 : VARIABLE_STRING_NO_1
Variable number 2 : VARIABLE_STRING_NO_1
Variable number 3 : VARIABLE_STRING_NO_1
Variable number 4 : VARIABLE_STRING_NO_1

有人能帮我推进正确的方向吗? (例如,使用其他容器而不是矢量,将方法改为......等)

另外,如果 VARIABLE_STRING 包含2个子字符串,其间有空格?这在我的数据中是可能的。

示例代码:

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main()
{
    vector<string> vectorOfLines, vectorOfData;

    vectorOfLines.push_back("some_string another_string yet_another_string VARIABLE_STRING_NO_1 next_string");
    vectorOfLines.push_back("some_string another_string yet_another_string VARIABLE_STRING_NO_2 next_string");
    vectorOfLines.push_back("some_string another_string yet_another_string VARIABLE_STRING_NO_3 next_string");
    vectorOfLines.push_back("some_string another_string yet_another_string VARIABLE_STRING_NO_4 next_string");

    string data = "", trash = "";
    stringstream token;

    int counter = 0;

    for( int i = 0; i < (int)vectorOfLines.size(); i++ )
    {
        token << vectorOfLines.at(i);
        token >> trash >> trash >> trash >> data >> trash;
        vectorOfData.push_back(data);                       //  wrong method here?
        counter++;                                          //  counter to test if for iterates expected times
    }

    cout << "Counter: " << counter << endl;

    for( int i = 0; i < (int)vectorOfData.size(); i++ )
    {
        cout << "Variable number " << i + 1 << " : " << vectorOfData.at(i) << endl;
    }

    return 0;
}

请原谅我的新手问题,但在过去5天尝试了不同的方法之后,我发现了咒骂并且不鼓励继续学习。
是的我对C ++很新 我已经成功地在PHP中完成了相同的程序(在这也是新手)并且看起来像C ++要难得多。

1 个答案:

答案 0 :(得分:4)

您想在阅读个人后重置字符串流。从它的外观来看,您使用的字符串流将进入失败状态。此时除了状态获得clear()之外,它不会有任何进一步的输入。此外,您应始终验证您的阅读是否成功。也就是说,我会以这样的方式启动循环体:

token.clear();
token.str(vectorOfLines[i]);
if (token >> trash >> trash >> trash >> data >> trash) {
    process(data);
}
else {
    std::cerr << "failed to read '" << vectorOfLines[i] << "\n";
}

我也会使用std::istringstream