Fopen получить ошибку с char * в C ++ - PullRequest
0 голосов
/ 12 декабря 2011

Есть функция для загрузки файлов:

int loadfile(char *fn)
{
    printf( "\n my path: '%s' \n", fn );
    FILE *f = fopen( fn, "r");
    printf( "got\n" );

    ...

    return 1;
}

Первый файл в main () newfile( argv[1] );, работает.Во-вторых, с помощью гибкого разбора / чтения первого файла я не верю в проблему.

Консоль:

path: 'file1.hot' 
got
path: 'file2.hot' 
Segmentation fault: 11

Printf смог напечатать char * fn, но fopen получил ошибку сегментации.

Следующая ситуация была, я попытался явным образомположить файл внутрь loadfile, делая fopen( "file2.hot", "r"); и работает.

Я компилирую с g ++, есть другой подход при использовании c ++ для использования char * или fopen?

РЕДАКТИРОВАТЬ

Извините, нет newfile( argv[1] );.Правильно: loadfile( argv[1] );.

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Общее замечание: при использовании C ++, пожалуйста, предпочитайте std::fstream стилю C * fopen / fread / и т.д .; также предпочитают от std::string до char*. Один только излечит много головных болей памяти. Если по какой-то причине вам необходимо придерживаться функций стиля C, обязательно проверьте возвращаемые значения (как уже упоминалось в других ответах здесь) - fopen, например, возвращает указатель NULL в случае сбоя.

Более конкретно к вашему вопросу: попробуйте запустить вашу программу под gdb (например, gdb <your-program>), чтобы увидеть, где именно происходит ошибка сегментации; таким образом, вы также сможете увидеть больше деталей (например, содержимое переменной и т. д.). В качестве альтернативы, если вы работаете в Linux, используйте инструменты анализа, такие как valgrind , чтобы обнаружить любые проблемы с доступом к памяти.

1 голос
/ 12 декабря 2011

Вы всегда должны проверять возвращаемые значения из функций, которые имеют возвращаемое значение. В этом случае убедитесь, что при открытии файла дескриптор возврата не равен NULL, а также, если вы открываете файл, закройте его.

1 голос
/ 12 декабря 2011

Научитесь использовать отладчик GDB (если вы работаете в Linux) или утилиту valgrind .Возможно, стоит поместить путь к файлу внутри std :: string , и, как упоминалось nyarlathotep , использовать std :: fstream .

Может случиться, что ваш fn не завершен нулем ....

Скомпилируйте с g++ -Wall -g

Когда Anders K ответил, всегда проверяйте результатfopen против NULL.Расширение Talpo Пьера Виттета для GCC (закодировано в MELT ) может автоматически проверять, что вы это делаете.

...