Программа никогда не доходит до той части, где я могу вводить информацию

#c #while-loop #text-files #ifstream

#c #цикл while #текстовые файлы #ifstream

Вопрос:

Когда я запускаю программу, окно вывода выводит строку «! Загрузка данных … » но, похоже, она бесконечно зацикливается. Насколько я могу судить, цикл 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]));
}
  

Комментарии:

1. вау, я не могу поверить, что я этого не видел. Итак, тогда мне нужно изменить его на tempLine.erase

2. @javaNoob пожалуйста, не редактируйте вопрос так, как вы это сделали. Вы изменили семантику кода, сделав недействительными приведенные комментарии. Я отменил вашу правку. Если вы хотите, вы можете опубликовать свой собственный ответ вместо этого.

Ответ №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 , поэтому цикл выполняется бесконечно, если delimiter2 найдено в tempLine .

Вместо этого вам нужно заменить 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);
}