Ошибка при копировании потока в c ++ с использованием rdbuf () и оператора << - PullRequest
2 голосов
/ 02 декабря 2011

«Стандартный» предлагаемый способ копирования файлов, например, через c ++:

ifstream ins;
ofstream out s;
// I've omitted the opening of those stream, since it is not important for the following question.

s << ins.rdbuf();

Теперь проблема в том, что вышеприведенная строка может потерпеть неудачу, а в некоторых случаях, особенно та, которую я 'Поговорим о том, что я никак не могу понять, что что-то пошло не так.

Предположим, что входной поток на самом деле представляет собой большой файл, например, на удаленном компьютере NAS.Теперь могут быть ошибки подключения, из-за которых дескриптор файла будет неверным.Пытаясь смоделировать это, я использовал большой файл, в отладчике я остановился на этой строке, нашел дескриптор, затем продолжил отладчик и затем принудительно закрыл дескриптор файла (через обработчик процессов пакета sysinternals).

Результат: строка завершена, файл копируется неправильно, иногда он вообще не копируется, иногда закрывается только часть файла.В отличие от документации оператора << и rdbuf (), установка плохого состояния / сбоя отсутствует, и не выдается исключение. </p>

Единственное, что я могу заметить, это то, что когдаПри попытке закрыть поток ввода возникает исключение.

У кого-нибудь такое же явление ?!Есть ли способ проверить / проверить это на правильность завершения?

С уважением,

1 Ответ

1 голос
/ 02 декабря 2011

Потоки печально известны плохими сообщениями об ошибках.В этом случае все, что вы можете сделать, это проверить badbit в потоке вывода;Стандарт требует, чтобы операторы << принимали все исключения, устанавливая badbit в случае их возникновения.И, очевидно, это не говорит вам, была ли ошибка вызвана ошибкой на входе или ошибкой на выходе.

Как правило, если вы используете реализации, которые поставляются с большинством компиляторов, не будетв любом случае сообщать об ошибке на входе.По большей части, если в последние годы ничего не изменилось, реализации filebuf обрабатывают ошибки при вводе точно так же, как конец файла.

Если вам нужна более качественная отчетность об ошибках, я думаю, что вы застряли в реализации вашейown streambuf (на самом деле не очень сложно), который отслеживает различные ошибки;затем вы можете спросить streambuf после передачи, какие ошибки он получил.

...