我希望在检测到某个子字符串后输出每一行。不知怎的,我得到了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...)
答案 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;
}
}