Программа для печати содержимого файла не может быть запущена, возвращает ошибку «Инструкция по в памяти, на которую ссылается » .

#c #file #command-line #memory-address #fault

Вопрос:

Я изучаю язык Си по книге. Я дошел до той части книги, где говорится о файлах и аргументах командной строки, но теперь я застрял на части с этим кодом:

 #include <stdio.h>
int main (int argc,char **argv)
{
    FILE *f=fopen(argv[1],"r");
    int c;
    do
    {
        c=fgetc(f);
        printf("%c",c);
    }
    while(!feof(f));
}
 

Когда я запускаю это (аргументом является собственное имя файла кода для тестирования), появляется сообщение об ошибке:

Инструкция по адресу 0x0000000000401474 ссылается на память по адресу 0x0000000000000006. Память не могла быть прочитана. Нажмите кнопку ОК, чтобы завершить программу. Нажмите кнопку ОТМЕНА, чтобы отладить программу.

В чем смысл этой ошибки и как ее исправить?

Комментарии:

1. Всегда проверяйте f после звонка fopen . Всегда проверяйте argc >= 2 перед доступом argv[1] . И обратите внимание, что «аргумент, являющийся собственным именем файла кода» , будет argv[0] в любом случае.

2. и если файл является двоичным файлом (не текстовым файлом), то printf("%d ",c); это было бы более полезно.

3. Я приношу извинения за недопонимание, @WeatherVane, что я имел в виду под «собственным именем файла кода», так это то, что несжатый код C был сохранен в файле под названием «tutorial.c», и я скомпилировал код и запустил исполняемый файл с fileopen tutorial.c

4. Не могу воспроизвести, но файл, который я дал ему в качестве аргумента, существует в папке по умолчанию . Проверяй argc и проверяй f .

5. Большое вам спасибо за ваши комментарии @Флюгер, мой код теперь работает.

Ответ №1:

Вам нужно проверить, не является ли указатель файла нулевым, поэтому что-то вроде

 if (f == NULL) {
    return EXIT_FAILURE;
}
 

Кроме того, файлы должны быть закрыты, когда они будут использованы.

 fclose(f);
 

Комментарии:

1. Большое вам спасибо за ваши предложения @Ada Lovelace, я реализовал и то, и другое, и теперь код работает.