C ++: я не понимаю, как работает этот цикл

Я смотрел на некоторые вопросы здесь, которые показывают вам, как читать из текстового файла, а затем назначить что-либо в нем для отдельных переменных. В ответе использовался цикл while, который выглядел следующим образом …

ifstream file(“file.txt”);

int var1;
int var2;
int var3;

while (file >> var1 >> var2 >> var3)
{
/* do something with name, var1 etc. */
cout << var1 << var2 << var3 << “\n”;
}

Мой вопрос: что происходит в цикле while, который позволяет присваивать этим переменным правильное значение? Я знаю, что это работает, потому что я использовал это, но я просто не понимаю, как это работает.

Вот ссылка, на которую я смотрел, на случай, если кто-то захочет посмотреть и на нее.
C ++: чтение из текстового файла и разделение на переменные

Спасибо!

0

Решение

В основном, «выражение»(А) file >> var1 >> var2 >> var3 будет пытаться прочитать три значения из file поток и поместите их в указанные переменные. Это в принципе не отличается от cin >> myVar сам по себе (за исключением того, что он изменяет вход множественный переменные).

значение всего этого выражения будет истинно, если и только если все три значения будут прочитаны успешно.

В этом случае тело цикла будет выполнено, три значения будут распечатаны, и цикл вернется к началу и попытается получить следующие три значения.

В точке, где выражение оценивается как ложное (т.е. три значения не читаются), цикл останавливается.


(А) Настоящий путь от someStream >> someVariable для логического значения включает в себя несколько шагов в классе потока (возвращаемое значение из operator>> превращается в логическое с operator bool) но приведенное выше объяснение должно быть достаточно хорошим для большинства целей.

3

Другие решения

перегрузки ifstream оператор >>. В вашем конкретном случае это:

basic_istream& operator>>( int& value );

как вы видите, он возвращает ссылку на себя, чтобы вы могли переписать:

 while (file >> var1 >> var2 >> var3)

как функция вызывает:

while (file.operator>>(var1).operator>>(var2).operator>>(var3))

Кроме того, ifstream явно преобразуется в bool, который дает значение true, если поток в порядке, в противном случае — значение false. Это преобразование сделано с использованием оператор bool, который помечен как явный (C ++ 11 и выше). Этот спецификатор, применяемый к оператору преобразования, позволяет использовать ifstream экземпляр в while петля или if заявления, но это не позволит вам, например, присвоить его переменной bool:

bool b = file; // results in error
1

Компилятор переведет: file >> var1 >> var2 >> var3 как: file.operator>>(var1).operator>>(var2).operator(var3)

Возвращение basic_istream::operator>>(int&) является basic_istream& следовательно, оператор извлечения может вызываться повторно при возврате, потому что он возвращает ссылку на себя.

Когда вы оцениваете это как: while(file >> var1 >> var2 >> var3) компилятор действительно делает: while(file.operator>>(var1).operator>>(var2).operator(var3).operator bool()) И мы можем видеть, что basic_stream обеспечивает operator bool() Так что это будет то, что оценивается как условие для while петля. А также operator bool():

Возвращает true если поток не имеет ошибок и готов к операциям ввода / вывода. В частности, возвращает !fail(),

Таким образом, понятная человеку интерпретация этой строки такова: «Вставьте var1, var2, а также var3 в file, Если вставки не завершились, продолжайте цикл. «

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector