функция fgets() в C

Я знаю, что все говорили мне использовать fgets, а не gets из-за переполнения буфера. Однако меня немного смущает третий параметр в fgets(). Насколько я понимаю, fgets зависит от:

char * fgets ( char * str, int num, FILE * stream );

char* str — это указатель на место, где будет храниться мой ввод.

num - это максимальное количество символов для чтения.

но что такое FILE *stream? Если я просто предлагаю пользователю ввести строку (например, предложение), должен ли я просто ввести «stdin»?

И я должен ввести FILE *stdin вверху, рядом с main()?


person emily    schedule 04.01.2010    source источник


Ответы (4)


Ты прав. stream — это указатель на структуру FILE, подобную той, что возвращается из fopen. stdin, stdout и stderr уже определены для вашей программы, поэтому вы можете использовать их напрямую вместо того, чтобы открывать или объявлять их самостоятельно.

Например, вы можете прочитать стандартный ввод с помощью:

fgets(buffer, 10, stdin);

Или из определенного файла с помощью:

FILE *f = fopen("filename.txt", "r");
fgets(buffer, 10, f);
person Carl Norum    schedule 04.01.2010
comment
Я думаю, что вторым параметром должен быть strlen(buffer) -1. Если вы не буфер 11 байт. - person ant2009; 06.01.2010
comment
@robUK, это сработает только в том случае, если в буфере не все нули с самого начала. Как упоминалось в OP, переполнение буфера на самом деле не является проблемой. - person Carl Norum; 06.01.2010

Да, вы должны просто использовать stdin. Это предопределенный FILE *, который считывается со стандартного ввода вашей программы. И он уже должен быть определен, если у вас есть #include <stdio.h> вверху вашего файла (который вам понадобится для fgets).

person Brian Campbell    schedule 04.01.2010

В целом существует два способа взаимодействия с файлами на языке C. Один из них — использование низкоуровневых системных вызовов, зависящих от ОС, таких как open(), read(), write() и т. д., которые работают с файловыми дескрипторами. Другой использует структуры FILE, которые используются в библиотечных функциях C, таких как fread(), fwrite() и т. д., включая ту, которую вы упомянули выше.

Как и в философии UNIX, все является файлом. Таким образом, даже стандартный ввод (stdin) обрабатывается как указатель на структуру FILE.

tl;dr Да, вы должны использовать stdin вместо FILE* stream в вашем вызове fgets()

person user108127    schedule 04.01.2010

FILE — это стандартный файл C. Да, если вы хотите читать со стандартного ввода, stdin является правильным символ.

person David Nehme    schedule 04.01.2010