【问题标题】:Program never gets to the part where I can input information程序永远不会到达我可以输入信息的部分
【发布时间】:2019-03-13 21:21:08
【问题描述】:

当我运行程序时,输出窗口会打印出“!正在加载数据...”这一行,但它似乎无休止地陷入循环。据我所知,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]));
}

【问题讨论】:

  • 哇,我不敢相信我没有看到这个。那么我需要把它改成 tempLine.erase
  • @javaNoob 请不要像您那样编辑问题。您更改了代码的语义,使给定的 cmets 无效。我已恢复您的编辑。如果需要,您可以发布自己的答案。

标签: c++ while-loop text-files ifstream


【解决方案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,则循环将无限运行。

您需要将line 替换为tempLine

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2015-07-24
    • 2019-08-14
    • 2015-12-09
    • 1970-01-01
    • 2014-03-11
    • 2020-04-12
    相关资源
    最近更新 更多