Я подозреваю, что происходит, когда операции вставляют данные в rdbuf
, связанный с потоком. Это успешно, пока есть место в буфере. В конце концов, буфер заполняется, и поток пытается записать в файл (который закрыт), и это не удается.
Вы можете проверить это, сделав последний бит циклом:
ofs.close();
std::cout << "closed" << std::endl;
CHECK(ofs);
for (int i = 0; i < 500; ++i)
{
ofs << "Hello, World!\n";
std::cout << i << " ";
CHECK(ofs);
}
std::cout << "after operation" << std::endl;
На моей машине он выходит из строя примерно через 300 - и навсегда после этого.
Это правильное поведение? (или даже соответствует стандартам?)
Я не знаю.
[Позже: если я изменю libc ++, при закрытии установите размер буфера равным 0, тогда первая запись завершится неудачно, что говорит о том, что мой анализ верен. Тем не менее, я до сих пор не нашел ничего в стандарте о том, что это «должно» делать. ]