fgets
fgets — функція стандартної бібліотеки C, призначена для зчитування рядка з потоку. Прототип функції описаний у заголовному файлі stdio.h. Він має вигляд:
char * fgets (char * str, int num, FILE * stream);
Агрументи:
- char * str — вказівник на буфер, в який зчитується рядок. Його максимальна довжина задається другим аргументом.
- int num — число, що обмежує кількість символів, які повинні бути зчитані.
- FILE * stream — вказівник на дескриптор файлу, з якого проводиться зчитування. Файл повинен бути відкритим.
У випадку успішного виконання функція повертає вказівник на зчитаний рядок, у разі невдачі — NULL.
Функція зчитує символи з потоку, доки не зустріне символ переводу рядка або кінця файлу, або доки не заповниться буфер. Максимальне число символів, які може зчитати fgets дорівнює N-1. У випадку, коли N-1 символ зчитано, а в потоці ще є символи, fgets поміщає 0 в N-ий байт буфера str і завершує роботу. У випадку, коли рядок вхідного потоку закінчився, а буфер str ще не заповнено, функція поміщає в буфер символ кінця рядка '\n', а після нього — 0.
Функція fgets найбезпечніша функція зчитування в C. На відміну від функції gets одним із її аргументів є обмежувач числа символів, які потрібно зчитати, тому небезпека переповнення буферу набагато менша. Функцією fgets рекомендується зчитувати не тільки рядки з файлів, а й рядки з вхідного потоку stdin. У цьому випадку виклик функції має вигляд:
result = fgets(str, num, stdin);
Функцію fgets рекомендується використовувати і в тому випадку, коли з файла потрібно зчитати число. Оскільки програміст, який пише програму, не може бути впевненим, що в файлі, вказаному коритувачем, завжди буде правильна очікувана інформація, безпечно спочатку зчитати вхідний рядок як рядок, проаналізувати його, а потім зчитати потрібні числа уже з буфера.
# include <stdio.h>
# DEFINE MAX_LEN 100
int main()
{
FILE * pFile;
char mystring [MAX_LEN +1];
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else {
fgets (mystring , MAX_LEN +1 , pFile);
puts (mystring);
fclose (pFile);
}
return 0;
}