Может кто-нибудь объяснить тонкую разницу в:
ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.rdbuf();
f.good() // filestream is bad!!ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.str();
f.good() // is still ok!
Я в основном использую .rdbuf () для передачи потока строк в файл (потому что это более эффективно), но если поток строк пуст, чем поток файлов становится плохим …? Разве это не глупо?
Я думаю, что я не совсем понимаю << s.rdbuf()
…
Оператор вставки, который «вставляет» потоковые буферы, устанавливает бит ошибки, если из потокового буфера не могут быть извлечены никакие символы — [ostream.inserters] / 9:
Если функция не вставляет никаких символов, она вызывает
setstate(failbit)
(который может броситьios_base:: failure
(27.5.5.4)).
В то время как оператор вставки, который выводит строку, явно не учитывает количество написанных символов.
Похоже, это происходит потому, что вставка потокового буфера «перенаправляет» потоковый буфер в поток — если никакие символы не могли быть извлечены, наверняка произошла ошибка в самом потоковом буфере, и эта ошибка должна быть представлена состоянием ошибки потоков. Вывод пустого потока — это исключение, которое, по-видимому, не считалось достаточно важным для учета при создании этого правила.