operator>>
устанавливает флаг потока eofbit
, если он пытается прочитать мимо EOF. Вы можете использовать это условие, чтобы разорвать ваши петли. Но вы должны фактически выполнить операцию чтения ДО того, как вы сможете оценить eof()
. См. Почему iostream :: eof внутри условия al oop (т. Е. `While (! Stream.eof ())`) считается неправильным? для получения более подробной информации об этом.
Поскольку вы имеют дело с текстом на основе строки, вы можете использовать std::getline()
, чтобы сначала прочитать каждую строку, а затем вы можете использовать std::istringstream
для анализа каждой строки, например:
int main()
{
vector<int> vec;
ifstream file ("file.txt");
string line;
while (getline(file, line)) {
istringstream iss(line);
int amount, nums;
iss >> amount;
cout << amount << endl;
for (int i = 0; (i < amount) && (iss >> nums); ++i){
vec.push_back(nums);
}
printArray(vec);
bubbleSort(vec);
vec.clear();
}
return 0;
}
В качестве альтернативы, вы можете просто взять Преимущество того факта, что operator>>
пропускает пробел, , включая разрывы строк, например:
int main()
{
vector<int> vec;
int amount, nums;
ifstream file ("file.txt");
while (file >> amount) {
cout << amount << endl;
for (int i = 0; (i < amount) && (file >> nums); ++i){
vec.push_back(nums);
}
printArray(vec);
bubbleSort(vec);
vec.clear();
}
return 0;
}
Хотя этот подход будет несколько менее устойчивым к ошибкам во входных данных, по сравнению к подходу std:getline()
. Если фактическое количество чисел в данной строке не соответствует указанному количеству в начале строки, при таком подходе чтение файла не будет синхронизировано c. Хуже того, если заданная строка содержит нецелочисленные значения, этот подход вообще не сможет читать любые последующие данные.
В подходе std:getline()
, если данная строка искажена, код просто переместится перейдите к следующей строке и продолжайте, как ничего плохого не случилось.