c сбой при попытке открыть файл с переменной filename

Как указано в названии, я прошу пользователя предоставить имя файла, и я использую gets чтобы сохранить его на str . Затем я пытаюсь получить доступ к файлу с использованием имени и сбоя программы.

 int openFile(FILE *fp){ puts("What's the name of the file (and format) to be accessed?"); char str[64]; gets(str); fp = fopen((const char *)str, 'r'); ... return 0; 

В основном:

 FILE *fp; // file pointer openFile(fp); 

Имя файла, которое я ввожу (data.txt), действительно находится в том же каталоге, что и остальная часть проекта, поэтому это не должно быть проблемой. Я попытался проверить, правильно ли открыт файл (что ему нужно), но он продолжает сбой сразу после того, как я даю имя.

Это должно быть fp = fopen(str, "r"); , потому что fopen() ожидает mode как char * указывающий на строку, а не на один char .

Кроме того, поскольку параметры в C передаются по значению , ваш fp не будет изменен после openFile() . Чтобы заставить его работать, вам придется переписать его и называть его openFile(&fp); , Вот пример:

 void openFile(FILE **fp) { puts("What's the name of the file (and format) to be accessed?"); char str[64]; fgets(str, 64, stdin); str[strcspn(str, "\n")] = '\0'; *fp = fopen(str, "r"); } 

fgets() используется для защиты от переполнения буфера.

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

В настоящее время у вас есть:

 void openFile(FILE* fp) { fp = ... } int main() { FILE* fp; openFile(fp); } 

Но fp в main() передается как указатель по значению. Это означает, что внутри openFile вы устанавливаете локальную переменную, в то время как прошедшая она не изменяется.

Чтобы решить проблему, вы можете:

  • прямое возrotation FILE* из openFile
  • принять указатель на аргумент указателя, чтобы иметь возможность его установить, например void openFile(FILE** fp) а затем openFile(&fp)

Имейте в виду, что вторым аргументом fopen является const char* не один char , "r" следует использовать.