Получите станд.:: сообщения об ошибках отказа fstream и/или исключения

Неверное имя файла

file.open("D://New folder//testcase//Project3//conf.json",ios::in ); 

оно должно быть

file.open("D:/New folder/testcase/Project3/conf.json",ios::in ); 

или

file.open("D:\\New folder\\testcase\\Project3\\conf.json",ios::in ); 

И цикл while неверен

[113 ]

это должно быть

while (file.getline(a, 80))
{
    cout << a << "\n";
}

См. Здесь Почему iostream :: eof внутри условия цикла считается неправильным?

Наконец, это всегда хорошая идея проверить успешность открытия файла

file.open("D:/New folder/testcase/Project3/conf.json",ios::in ); 
if (!file.is_open())
{
    cout << "can't open file !!!\n";
    return 0;
}

32
задан Jan Rüegg 17 April 2013 в 13:58
поделиться

3 ответа

From checking it out I found that also errno and also GetLastError() do set the last error and checking them is quite helpful. For getting the string message use:

strerror(errno);
2
ответ дан 27 November 2019 в 21:04
поделиться

Потоки по умолчанию не генерируют исключения при ошибке, они устанавливают флаги. Вы можете сделать так, чтобы они генерировали исключения, используя функцию-член stream ():

ifstream ifs;
ifs.exceptions( std::ios::failbit );   // throw if failbit get set

Теоретически вы можете сделать что-то вроде этого:

try {
  int x;
  ifs >> x;
}
catch( const std::exception & ex ) {
   std::cerr << "Could not convert to int - reason is " 
                  << ex.what();
}

К сожалению, стандарт C ++ не определяет, что генерируемые исключения содержат какие-либо сообщения об ошибках, поэтому вы находятся на конкретной территории реализации.

30
ответ дан 27 November 2019 в 21:04
поделиться

Краткий ответ: нет. Даже проверка errno после обнаружения сбоя (например, с помощью bad () , fail () ) после различных операций не работает надежно. Создание ifstream / ofstream для переноса файла, который не может быть открыт, не обязательно устанавливает бит сбоя, пока вы не попытаетесь прочитать, записать или закрыть его.

Длинный ответ: вы можете вызвать ios :: exceptions (ios_base :: iostate) , чтобы запросить, чтобы ios_base :: ios_failure генерировались, когда соответствующий бит (badbit, failbit, eofbit), но это (по крайней мере, в библиотеках GNU и Microsoft C ++) не дает вам больше информации, чем ручная проверка битов, и в конечном итоге оказывается бессмысленным, ИМХО.

9
ответ дан 27 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: