разница между & lt; & lt; s.str () и & lt; & lt; s.rdbuf ()

Может кто-нибудь объяснить тонкую разницу в:

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()

4

Решение

Оператор вставки, который «вставляет» потоковые буферы, устанавливает бит ошибки, если из потокового буфера не могут быть извлечены никакие символы — [ostream.inserters] / 9:

Если функция не вставляет никаких символов, она вызывает setstate(failbit)
(который может бросить ios_base:: failure (27.5.5.4)).

В то время как оператор вставки, который выводит строку, явно не учитывает количество написанных символов.

Похоже, это происходит потому, что вставка потокового буфера «перенаправляет» потоковый буфер в поток — если никакие символы не могли быть извлечены, наверняка произошла ошибка в самом потоковом буфере, и эта ошибка должна быть представлена ​​состоянием ошибки потоков. Вывод пустого потока — это исключение, которое, по-видимому, не считалось достаточно важным для учета при создании этого правила.

5

Другие решения