Получение лучших сообщений об ошибках для iostreams - PullRequest
0 голосов
/ 20 мая 2011

Я реализовал небольшую программу, которая может извлекать (и с помощью монтирования предохранителя) определенный формат архива.Я использую boost::filesystem::ifstream, но в случае ошибки (например, файл, который пользователь хочет извлечь, не существует), я получаю очень невнятные сообщения об ошибках.Интересно, есть ли способ получить более качественные сообщения об ошибках для проблем ввода-вывода в C ++?

В связи с этим я хотел бы знать, должен ли я использовать C FILE* или в случае файловой системы fuse просто обычный файлдескрипторы?Потому что strerror(errno) намного лучше, чем то, что дают мне iostreams.

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Мы не могли найти лучшего способа, чем использование boost :: iostreams и реализация нашего собственного файлового приемника и исходного кода.

Если вы хотите, вы можете получить исходный код здесь (по лицензии Apache):

http://sourceforge.net/projects/cgatools/files/1.3.0/cgatools-1.3.0.9-source.tar.gz/download

соответствующие файлы:

cgatools / util / Streams. [Ch] pp

0 голосов
/ 10 июля 2011

Поскольку вы все равно используете библиотеку файловой системы, вы можете проверить, существует ли файл , прежде чем пытаться получить к нему доступ через поток. Это позволило бы избежать проблем с раздуванием, но не работало бы в том же смысле, что и вы, т. Е. Сам поток не выполнял бы проверку существования.

Однако, поскольку вы используете boost::filesystem::ifstream, я предполагаю, что вы используете это, потому что вы используете boost::filesystem::path. В реализации Boost ifstream они наследуются от std::basic_ifstream и переопределяют две функции: конструктор и open. Таким образом, если вы хотите улучшить отчетность об ошибках, вы можете просто сделать то же самое, наследовать от реализации boost и переопределить эти две функции, чтобы обеспечить желаемую проверку. Дополнительный раздув: вероятно, не много, и он включает в себя поведение, которое вы хотите в самом потоке.

...