Fgets() - C (СИ)
Формулировка задачи:
Добрый день. Друзья, помогите разобраться в следующем. Нужно построчно считать файл. И вот какой вопрос.
char d[300] - массив. Он описывается адресом начала массива и длиной. Тоесть, функция fgets кладет 350 значений по адресу начала массива d. И все работает! Но длинна d только 300. И ничего никуда не пропадает. Как так?
Если функция будет читать первые 15 символов - fgets (d, 15, f) - то строки все равно попадут полностью в d (Длина одной строки 150-250 символов).
Объясните, пожалуйста, почему?
{ FILE *f; char d[300]; char* h = "f"; f = fopen("f1.txt", "r"); while(!feof(f)) { fgets(d, 350, f); printf("%s",d); } scanf(h); return 0; }
Решение задачи: «Fgets()»
textual
Листинг программы
/*...*/ FILE * f; char buf[256]; int iVal; char[256] sVal; double dVal; /* открытие файла */ while ( fgets(buf, 256, f) ) { if ( *buf == '\n' || *buf == '#' ) continue; if ( sscanf(buf, "%d %s %lf", &iVal, sVal, &dVal) != 3 ) { /* PARSING ERROR! */ } /* что-то сделать с прочитанными переменными */ } /*...*/
Объяснение кода листинга программы
- Объявлены необходимые переменные:
FILE * f;
- указатель на файл для чтения;char buf[256];
- буфер для чтения строки из файла;int iVal;
- переменная для хранения целочисленного значения;char sVal[256];
- переменная для хранения строкового значения;double dVal;
- переменная для хранения числового значения с плавающей точкой.
- Открывается файл в режиме чтения с помощью функции
fopen()
. - Запускается цикл
while
, который будет выполняться до тех пор, пока функцияfgets()
успешно читает строку из файла. - В каждой итерации цикла проверяется, является ли первый символ строки символом новой строки или символом решетки. Если это так, то цикл переходит к следующей итерации, игнорируя текущую строку.
- Если первая строка не является символом новой строки или символом решетки, то строка считывается с помощью функции
sscanf()
. - Функция
sscanf()
пытается считать три значения из строки: целочисленное значениеiVal
, строковое значениеsVal
и числовое значение с плавающей точкойdVal
. - Если функция
sscanf()
не смогла считать все три значения, то считается, что произошла ошибка парсинга, и выполняется блок кода, помеченный комментарием «PARSING ERROR!». - Если все три значения успешно считаны, то выполняется блок кода, который должен что-то делать с этими значениями.
- После завершения цикла
while
закрывается файл с помощью функцииfclose()
. - Если была допущена ошибка при открытии файла или чтении из него, то программа выдаст сообщение об ошибке и завершится.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д