2009-02-16 16 views
2

Используя этот код:подталкивания во время выполнения

#include <fstream> 

#include <boost/archive/text_oarchive.hpp> 

using namespace std; 

int main() 
{ 
    std::ofstream ofs("c:\test"); 
    boost::archive::text_oarchive oa(ofs); 
} 

Я получаю необработанное исключение во время выполнения на выполнение архив подталкивания линии:

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::archive::archive_exception> > 

ответ

6

Следующая строка с ошибкой:

std::ofstream ofs("c:\test"); 

Компилятор уже выплюнуть предупреждение (по крайней мере), если файл был назван jest; но '\t' - это побег для вставки вкладки, ваша ошибка идет неотображаемой. Короче говоря, файл не будет создан. Вы можете проверить это с помощью:

if (ofs.good()) { ... } 

Теперь, так как файл не был создан, вы не имеете действительный итератор, чтобы пройти на boost::archive::text_oarchive, который бросает исключение.

Попробуйте это:

std::ofstream ofs("c:\\test"); 
//     --^ (note the extra backslash) 
if (ofs.good()) { 
    boost::archive::text_oarchive oa(ofs); 
    // ... 
} 

Надеется, что это помогает!

PS: Окончательный нит я не мог остановить себя от делать - если вы собираетесь использовать

using namespace std; 

затем

ofstream ofs("c:\\test"); 

достаточно хорошо. Конечно, это не ошибка для квалификации ofstream, но это не лучший стиль кодирования. Но тогда вы знаете, что использование using namespace - это плохо, не так ли?

PPS: Спасибо - sharptooth за напоминание мне, что \t получает вас вкладку!

+1

\ t - горизонтальная ТАБ, поэтому компилятор очень маловероятен для восприятия запаха. – sharptooth

+0

Взрыв на! Спасибо sharptooth. – dirkgently

+2

Вы также можете использовать c:/test - прямая косая черта работает как в Windows, так и в Unix-системах как разделитель путей и не требует цитирования. – Ferruccio

2

Вам нужно поймать исключение, а затем изучить его exception_code, чтобы узнать, что является основной причиной.

Смежные вопросы