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(). - Если была допущена ошибка при открытии файла или чтении из него, то программа выдаст сообщение об ошибке и завершится.