2010-01-04 12 views
13

Я знаю, что все говорили мне использовать fgets и не получают из-за переполнения буфера. Тем не менее, я немного смущен третьим параметром в fgets(). Как я понимаю, fgets зависит от:Функция fgets() в C

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

char* str является PTR, где мой вклад будет сохранен.

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

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

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

ответ

14

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

Например, вы можете прочитать из стандартного ввода с:

fgets(buffer, 10, stdin); 

Или из конкретного файла с:

FILE *f = fopen("filename.txt", "r"); 
fgets(buffer, 10, f); 
+1

Я думаю, что второй параметр должен быть STRLEN (буфер) -1. Если буфер не равен 11 байтам. – ant2009

+0

@robUK, это будет работать только в том случае, если для начала буфера не были все нули. Как упоминалось в ОП, переполнение буфера на самом деле не вызывает беспокойства. –

1

ФАЙЛ стандартный файл C. Да, если вы хотите читать со стандартного ввода, stdin - правильный символ.

1

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

1

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

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

Т.Л., д-р Да, вы должны использовать stdin для FILE* stream в вызове к fgets()