2011-05-19 3 views
0

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

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

+1

Вы имеете в виду 'std :: ifstream'? AFAIK, нет 'boost :: filesystem :: ifstream' ... – Thanatos

+1

@Thanatos: Boost.Filesystem v2 не сделал, но v3 делает. См. Соответствующие документы [здесь] (http://www.boost.org/doc/libs/release/libs/filesystem/v3/doc/reference.html#File-streams). – ildjarn

ответ

1

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

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

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

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

cgatools/Util/Streams [ч] с

+0

Ну, это содержит удивительные реализации iostream, но я не уверен, может ли это быть overbloat. Кроме того, я бы предпочел не вырвать несколько уроков из другого проекта и не вставить его в свои собственные. Это чертовски поддерживать. Если бы была небольшая небольшая библиотека C++ IO (поддерживаемая крупными дистрибутивами Linux) с хорошими сообщениями об ошибках и высокой производительностью, я с удовольствием ее буду использовать. Но я не уверен, что лучше использовать базовый C IO. Я жду ответа от людей, которые знают FUSE лучше (размещен вопрос о рассылке FUSE). – panzi

+0

(я имел в виду переполнения * для моих целей *.) – panzi

0

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

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