istringstream 的五倍输出

Fivefold output from 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...)

你的问题是

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

0001(0.0, 45.0, -390.0).png 获取 0.0, 45.0, -390.0 的逻辑是在一个 while 循环中,您甚至什么都不做。该循环将为每一行输入执行 5 次(因为有五个 "sub strings"),因此您将获得 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;
    }
}