Как использовать и вводить данные от пользователя в качестве аргумента в функции fopen ()? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь создать код, который откроет файл в заданном режиме с помощью fopen, но я хочу, чтобы пользователь мог сообщить программе имя или путь к файлу, который он хочет открыть, но компилятор кричит у меня код, который я написал, следующий:

printf("Path/Name of the file: \n");
char input_user = getchar();

filePointer = fopen(input_user, "r");

Ошибка, которую возвращает компилятор, следующая: «предупреждение: передача аргумента 1 из 'fopen' делает указатель из целого числа без приведения [-Wint -conversion] filePointer = fopen (input_user, "r"); "

и это:" примечание: ожидается 'const char * restrict', но аргумент имеет тип 'char' extern FILE * fopen (const char * __restrict __filename, "

1 Ответ

1 голос
/ 29 мая 2020

Как сказано в « какой-то чувак-программист », fopen принимает char * (указатель на char), а не один char. Как он также заявил, подойдет использование массива.

Я просто скомпилирую его комментарии в ответ.

#include <stdio.h>

int main()
{
    printf("Path/Name of the file: \n");
    char filename[128];
    scanf("%127s", filename);

    FILE *filePointer = fopen(filename, "r");
    return 0;
}

Я предлагаю вам использовать этот синтаксис scanf (% NUMBERs), чтобы избежать легкое переполнение буфера, которое может привести к краху sh и уязвимости безопасности. Не забывайте о дополнительном \ 0 для размера вашего буфера (я называю переменную имени файла вашим буфером) и будьте осторожны с пользовательским вводом в любом приложении с реальным словом, особенно когда это важно для чего-то столь же важного, как доступ к файлам. Имея доступ к этой программе, можно было бы просто открыть любой файл даже выше этого в дереве файлов, используя ../.

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

В вашем случае компилятор явно сообщает вам, что функции требуется char *, и вы даете ей char (здесь написано const char * restrict , но const и restrict здесь, чтобы сообщить вам, что указатель не будет изменен в функции).

expected ‘const char * restrict’ but argument is of type ‘char’

Надеюсь, вы понимаете лучше что было не так и что это было достаточно ясно!

...