Я использую функции сериализации boosts для сериализации и сохранения данных во внешние файлы в моем проекте, а затем для их дальнейшего чтения.C++ повысить сериализацию, как предотвратить сбои с неправильными файлами
Проблема, с которой я сталкиваюсь, заключается в том, что если файл читается (по ошибке) не в правильном формате, программа вылетает (возможно, ожидается).
Как определить, что файл находится в неправильном формате и прервать процесс чтения до сбоя программы?
EDIT:
Я попытался попробовать поймать построить в моем чтении в функции, которая выглядит следующим образом
int read_binary(file_in_out* object){
std::ifstream ifs((*object).file.c_str());
try
{
boost::archive::binary_iarchive ia(ifs);
ia >> (*object).content;
}
catch (boost::archive::archive_exception& ex)
{
std::cout << "An exception occurred. Exception Nr. " << '\n';
return 1;
}
catch (int e)
{
std::cout << "An exception occurred. Exception Nr. " << e << '\n';
return 1;
}
return 0;
}
Это ловит исключение, если файл не имеет ничего общего со структурами, которые его пытается прочесть в нем. Однако, когда я использую устаревшую версию, она не вызывает исключения и сбой в строке 'ia >> (* object) .content;' Есть идеи?
Это неизбежно произойдет, если файл находится в двоичном формате, а структурированная программа не соответствует структурам, которые хранятся (если не считать версии и не приняты меры предосторожности). –
@ DieterLücking Я считаю несправедливым сказать, что «он неизбежно потерпит крах». Существует санитария для ввода и хорошо применяется для двоичного ввода. Это просто требует внимания к деталям. Я не уверен в встроенном материале, но я полностью ожидаю 'std :: bad_alloc', например. когда вы ошибочно резервируете для огромного вектора и красивое исключение архива или 'std :: basic_istream :: failure', если вы достигли неожиданного конца файла, пропавших разделителей, поврежденных кодов типов ... – sehe
Попытка try/catch для исключений (см. править), но без радости ... – user3353819