istringstream的五倍输出

时间:2017-07-19 11:38:59

标签: c++ output istringstream

我希望在检测到某个子字符串后输出每一行。不知怎的,我得到了iss的五倍输出。这是我的代码:

    //load all data from txt
        string data;
        std::ifstream infile("SavedData.txt");
        while (std::getline(infile, data)) {
            std::istringstream iss(data);
            string d;
            while (iss >> d) {
                //extract substring
                unsigned firstBracket = data.find("(");
                unsigned lastBracket = data.find(")");
                string coordSynth = data.substr(firstBracket + 1, lastBracket - firstBracket - 1);
                cout << coordSynth << endl;
            }
        }

现在的输出就像:

0.0, 45.0, -390.0
0.0, 45.0, -390.0
0.0, 45.0, -390.0
0.0, 45.0, -390.0
0.0, 45.0, -390.0
0.0, 45.0, -314.3
0.0, 45.0, -314.3
0.0, 45.0, -314.3
0.0, 45.0, -314.3
0.0, 45.0, -314.3
etc.

其实我只想要

0.0, 45.0, -390.0
0.0, 45.0, -314.3
0.0, 45.0, -277.3
etc.

不,在txt文件中没有重复项。该文件如下所示:

0001(0.0, 45.0, -390.0).png 
0003(0.0, 45.0, -314.3).png 
0007(0.0, 45.0, -277.3).png (and so on...)

1 个答案:

答案 0 :(得分:2)

你的问题是

unsigned firstBracket = data.find("(");
unsigned lastBracket = data.find(")");
string coordSynth = data.substr(firstBracket + 1, lastBracket - firstBracket - 1);
cout << coordSynth << endl;

0.0, 45.0, -390.0获取0001(0.0, 45.0, -390.0).png的逻辑是在一个你甚至不做任何事情的while循环中。对于每一行输入,该循环将执行5次(因为有五个&#34;子字符串&#34;)所以你得到5个输出。你需要做的就是摆脱while循环,因为你没有对行中包含的单个字符串做任何事情。这给你一些像

int main() 
{   
    std::string data;
    std::istringstream infile("0001(0.0, 45.0, -390.0).png\n0003(0.0, 45.0, -314.3).png\n0007(0.0, 45.0, -277.3).png\n");
    while (std::getline(infile, data)) {
        std::istringstream iss(data);
        std::string d;
        //extract substring
        unsigned firstBracket = data.find("(");
        unsigned lastBracket = data.find(")");
        std::string coordSynth = data.substr(firstBracket + 1, lastBracket - firstBracket - 1);
        std::cout << coordSynth << std::endl;
    }
}