Почему этот закрытый поток все еще «хорош» после того, как я пытаюсь извлечь из него? - PullRequest
3 голосов
/ 31 декабря 2011

В 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 ]

2 голосов
/ 31 декабря 2011

Проблема в том, что порядок вызова операций над f не указан стандартом. Компилятор может вызывать f.good(), f.bad() и f.get() в любом порядке по своему выбору.

Попробуйте изменить, чтобы напечатать его в отдельных строках.

1 голос
/ 31 декабря 2011

Я только что понял, что я глупый:

#include <iostream>
#include <fstream>

int main() {
   std::ifstream f;
   std::cout << f.get() << ", ";
   std::cout << f.good() << ", " << f.bad();
}

// Output: -1, 0, 0

Неуказанный порядок оценки. Duh.

...