#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, я реализовал и то, и другое, и теперь код работает.