Почему этот закрытый поток все еще "хорош" после того, как я пытаюсь извлечь из него?
В GCC 4.7.0 20111217, GCC 4.1.2, GCC 4.3.4 и GCC 4.5.1:
#include <iostream>
#include <fstream>
int main() {
std::ifstream f;
std::cout << f.get() << ", " << f.good() << ", " << f.bad();
}
// Output: -1, 1, 0
Я бы ожидал -1, 0, 1
(который дает мне Clang 3.1) из-за этих параграфов:
[C++11: 27.7.2.3]:
int_type get();
4 Эффекты: ведет себя как неотформатированная функция ввода (как описано в пункте 27.7.2.3, параграф 1). После создания часового объекта, извлекает персонажа
c
, если таковой имеется. В противном случае вызовы функцииsetstate(failbit)
, который может броситьios_base::failure
(27.5.5.4),
5 возвращает:c
если доступно, в противном случаеtraits::eof()
,
а также:
[C++11: 27.9.1.1/3]:
Особенно:
- Если файл не открыт для чтения, последовательность ввода не может быть прочитана.
- Если файл не открыт для записи, выходная последовательность не может быть записана.
- Совместная позиция файла поддерживается как для входной, так и для выходной последовательности.
GCC не в порядке здесь? Неужели исполнитель неверно истолковал "иначе" в [C++11: 27.7.2.3/4]
? Или я неправильно истолковал стандарт?
2 ответа
Я только что понял, что я глупый
#include <iostream>
#include <fstream>
int main() {
std::ifstream f;
std::cout << f.get() << ", ";
std::cout << f.good() << ", " << f.bad();
}
// Output: -1, 0, 0
Неуказанный порядок оценки. Duh.
Проблема в том, что порядок вызова операций над f не указан стандартом. Компилятор может свободно звонить f.good()
, f.bad()
, а также f.get()
в любом порядке он выбирает.
Попробуйте изменить, чтобы напечатать его на отдельных строках.