Вот трассировка вызовов из документации:
void std::basic_ofstream::close();
Эффективно вызывает rdbuf()->close()
. Если во время работы возникает ошибка, вызывается setstate(failbit)
.
std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const;
Возвращает ассоциативный поток буфера. Если нет связанного буфера потока, возвращается NULL
.
std::basic_streambuf
фактически наследует std::basic_filebuf
, поэтому:
std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close();
Если область положить существует (например, файл был открыт для записи), первые звонки overflow(Traits::eof())
писать все в ожидании выхода в файл, включая любые последовательности без сдвига.
Если совсем недавно вызываемая функция, из underflow()
, overflow()
, seekpos()
и seekoff()
, был overflow()
, затем вызывает std::codecvt::unshift()
, возможно, несколько раз, чтобы определить unshift последовательности в соответствии с проникнуто локал, и пишет, что последовательность в файл с overflow(Traits::eof())
.
Затем закрывает файл, как если бы он вызывал std::fclose
, независимо от того, выполнено или нет какой-либо из предыдущих вызовов.
ПРИМЕЧАНИЕ.close()
обычно вызывается через деструктор std::basic_filebuf
(который, в свою очередь, как правило, называется по деструктора std::basic_fstream
Прежде всего, мы можем видеть, что это Безразлично» t фактически вызывают flush()
, как и ожидалось. Тем не менее, эффект flushing действительно встречается в методе std::basic_filebuf::close()
. Кроме того, мы видим, что он по-прежнему немного искажает файл, то есть записывает последовательность без сдвига. происходит тогда, файл просто закрывается.
Обратите внимание на ПРИМЕЧАНИЕ выше: в большинстве случаев вам даже не нужно звонить std::basic_ofstream::close()
явно.
Я перефразировал свой вопрос, см. Редактирование оригинального сообщения. – NPS