Я узнал, что я могу скопировать C ++ std :: istream в C ++ std :: ostream, выведя функцию istreams 'rdbuf (). Я использовал его несколько раз, и он работал нормально.
Сегодня у меня возникли проблемы, потому что эта операция устанавливает badbit, если std :: istream пуст (по крайней мере для std :: istringstream). Я написал следующий код, чтобы продемонстрировать мою проблему:
#include <stdio.h>
#include <sstream>
int main(int argc, char *argv[])
{
std::ostringstream ss;
ss << std::istringstream(" ").rdbuf(); // this does not set failbit
printf("fail=%d\n", ss.fail());
ss << std::istringstream("").rdbuf(); // why does this set failbit ???
printf("fail=%d\n", ss.fail());
}
Я пробовал Windows / VS2017 и Linux / g cc -9.20, и оба ведут себя одинаково.
Я использую стандартный :: istream & в сигнатуре метода со значением по умолчанию std :: istringstream (""). Вызывающий код должен передавать необязательный istream, который добавляется к некоторым другим данным.
- Кто-нибудь может объяснить, почему установлен badbit?
- Есть ли лучший способ реализации этот необязательный std :: istream & параметр?
Я знаю, я мог бы написать два метода, один с дополнительным параметром std :: istream &, но я хочу избежать дублирования кода.
Заранее спасибо,
Марио
Обновление 22-апр-20
Теперь я использую следующий код:
#include <stdio.h>
#include <sstream>
int main(int argc, char *argv[])
{
std::ostringstream out;
std::istringstream in("");
while (in)
{
char Buffer[4096];
in.read(Buffer, sizeof(Buffer));
out.write(Buffer, in.gcount());
}
printf("fail=%d\n", out.fail());
}
Я также добавил предупреждение о настройке битов при копировании пустых файлов в { ссылка }