Функция fgets() в C
Я знаю, что все говорили мне использовать fgets и не получают из-за переполнения буфера. Однако я немного смущен третьим параметром в fgets()
. Как я понял, fgets зависит от:
char * fgets ( char * str, int num, FILE * stream );
char* str
- это ptr, где мой вход будет сохранен.
num
- максимальное количество символов для чтения.
но что такое FILE *stream
? Если я просто предлагаю пользователю ввести строку (например, предложение), я должен просто набрать "stdin
"?
И я должен набрать FILE *stdin
вверху, рядом с main()
?
Спасибо,
Эмили
Ответы
Ответ 1
Вы правы. stream
- это указатель на структуру FILE
, подобную той, которая возвращена из fopen
. stdin
, stdout
и stderr
уже определены для вашей программы, поэтому вы можете использовать их напрямую, а не открывать или объявлять их самостоятельно.
Например, вы можете читать со стандартного ввода с помощью:
fgets(buffer, 10, stdin);
Или из определенного файла с помощью:
FILE *f = fopen("filename.txt", "r");
fgets(buffer, 10, f);
Ответ 2
FILE - это стандартный файл C. Да, если вы хотите читать со стандартного ввода, stdin является правильным символом.
Ответ 3
Да, вы должны просто использовать stdin
. Это предопределенный FILE *
, который читается со стандартного ввода вашей программы. И он уже должен быть определен, если у вас есть #include <stdio.h>
в верхней части файла (что вам нужно для fgets
).
Ответ 4
В общих чертах есть два способа взаимодействия с файлами в C. Один использует системные вызовы, зависящие от уровня ОС, такие как open()
, read()
, write()
и т.д., которые работают с файловыми дескрипторами. Другой использует структуры FILE
, которые используются в библиотечных функциях C, таких как fread()
, fwrite()
и т.д., Включая тот, который вы упомянули выше.
Как и в философии UNIX, все это файл. Таким образом, даже стандартный ввод (stdin
) рассматривается как указатель на структуру FILE
.
tl; dr Да, вы должны использовать stdin
для FILE* stream
в своем обращении к fgets()