Я смотрел на некоторые вопросы здесь, которые показывают вам, как читать из текстового файла, а затем назначить что-либо в нем для отдельных переменных. В ответе использовался цикл 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 ++: чтение из текстового файла и разделение на переменные
Спасибо!
В основном, «выражение»(А) file >> var1 >> var2 >> var3
будет пытаться прочитать три значения из file
поток и поместите их в указанные переменные. Это в принципе не отличается от cin >> myVar
сам по себе (за исключением того, что он изменяет вход множественный переменные).
значение всего этого выражения будет истинно, если и только если все три значения будут прочитаны успешно.
В этом случае тело цикла будет выполнено, три значения будут распечатаны, и цикл вернется к началу и попытается получить следующие три значения.
В точке, где выражение оценивается как ложное (т.е. три значения не читаются), цикл останавливается.
(А) Настоящий путь от someStream >> someVariable
для логического значения включает в себя несколько шагов в классе потока (возвращаемое значение из operator>>
превращается в логическое с operator bool
) но приведенное выше объяснение должно быть достаточно хорошим для большинства целей.
перегрузки 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
Компилятор переведет: 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
, Если вставки не завершились, продолжайте цикл. «