程序永远不会进入我可以输入信息的部分



当我运行程序时,输出窗口将打印出线"!加载数据...",但似乎它被无休止地卡在循环中。据我所知,正确设置了while循环,但是插入后,我将亏本。

ifstream myfile("Data.CS.txt");
if (!myfile) { //Always test the file open. 
    cout << "Error opening output file" << endl;
    system("pause");
    return -1;
}
cout << endl;
cout << "! Loading Data...";
while (getline(myfile, line)) {
    string delimiter = "|";
    string delimiter2 = "-=>";
    size_t pos = 0;
    string tempLine;
    string tokenName;
    string token;
    string token2;
    vector <string> storeTokenPairs;
    tokenName = line.substr(0, pos);
    tempLine = line.erase(0, pos + delimiter.length());
    while ((pos = tempLine.find(delimiter2)) != string::npos) {
        token = tempLine.substr(0, pos);
        storeTokenPairs.push_back(token);
        line.erase(0, pos + delimiter2.length());
    }
    for (int i=0; i<storeTokenPairs.size(); i++)
        dictionary.emplace(tokenName, make_pair(storeTokenPairs[i], storeTokenPairs[i+1]));
}

以下代码行是错误的:

 while ((pos = tempLine.find(delimiter2)) != string::npos) {
    token = tempLine.substr(0, pos);
    storeTokenPairs.push_back(token);
    line.erase(0, pos + delimiter2.length()); // <-- HERE
}

您永远不会修改tempLine,因此,如果在tempLine中找到delimiter2,则循环无休止地运行。

您需要用tempLine替换line

tempLine.erase(0, pos + delimiter2.length());

另外,您实际上根本不需要修改tempLine,因为find()将可选的启动索引作为输入:

size_t start = 0, pos;
while ((pos = tempLine.find(delimiter2, start)) != string::npos) {
    token = tempLine.substr(start, pos-start);
    storeTokenPairs.push_back(token);
    start = pos + delimiter2.length();
}
if (start < tempLine.length()) {
    token = tempLine.substr(start);
    storeTokenPairs.push_back(token);
}

相关内容

最新更新