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