powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по fgets()
10 сообщений из 10, страница 1 из 1
Вопрос по fgets()
    #32777538
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть текстовый файл. Структура строк: Фамилия (30 знаков), год (5) ... в общем длина строки равна 45 знаков. Надо выделить из каждой строки фамилию и занести в поле структуры. Код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <stdio.h>
#include <string.h>

struct{
	char fio[ 30 ];
        ...
} mass[ 20 ];

void main(){
	FILE *f;
	char Str[ 45 ];
	int i= 0 ;

	f = fopen("Sotrud.txt","rt");
	while(!feof(f)){
		fgets(Str, 45 ,f);
		strncpy(mass[i].fio, Str,  30 );
		i++;
	}
}

Так вот, допустим первая строка Иванов.... Вторая - Петров....
В дебюгере вижу при i=0 - Иванов
i=1 - какая-то ерунда вроде как пустые значения
i=2 Петров
i=3 - опять ерунда

Наверное неправильно определяется конец строки?
Или надо как указывать его?
Что-то я слышал что надо вводить некие символы "\0", зачем? Или это не то?
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777582
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
             ...
	char Str[ 128 ];
	int i= 0 ;

	f = fopen("Sotrud.txt","rt");
	while(!feof(f)){
		fgets(Str, 128 ,f);
		strncpy(mass[i].fio, Str,  30 );
		i++;
	}
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777599
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и еще одно... В сухом остатке:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <stdio.h>
#include <string.h>

struct{
	char fio[ 31 ]; // необходимо еще где-то терминатор хранить
        ...
} mass[ 20 ];

void main(){
	FILE *f;
	char Str[ 128 ];
	int i= 0 ;

	f = fopen("Sotrud.txt","rt");
	while(!feof(f) && i< 20 ){
		fgets(Str, 128 ,f);
		strncpy(mass[i].fio, Str,  30 )[ 30 ] = '\0';
		i++;
	}
             fclose(f);
             exit( 0 );             
}
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777604
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со 128 - все нормально. Че ж такое?
Да и еще одна проблема. Пытаюсь сразу за блоком while вывести значения:
Код: plaintext
1.
for(int j= 0 ; j<i; j++)
		printf("\n%s",mass[i].fio);

А выводятся пустые строки. Что не так?
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777607
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
for(int j= 0 ; j<i; j++)
//    printf("\n%s",mass[i].fio);
    printf("\n%s",mass[j].fio);
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777608
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий// необходимо еще где-то терминатор хранить
[30] = '\0';


Да, да, я вот слышал про это. А зачем?
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777615
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, вот с j лоханулся. Аж стыдно!
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777628
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
// необходимо еще где-то терминатор хранить
[30] = '\0';
Да, да, я вот слышал про это. А зачем?

Все строки C должны заканчиваться терминатором '\0' - это является признаком конца С-строки. Например, при выводе с помощью printf(%s, str) строки str именно '\0' говорит printf, что строка закончилась. Понятно?
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777673
alexFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий, спасибо огромное. Насчет '\0' все понятно.
Я не понял только почему 128 ?
...
Рейтинг: 0 / 0
Вопрос по fgets()
    #32777699
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Я не понял только почему  128 ?

Вообще, здесь может быть любое число заведомо большее, чем длина самой длинной строки файла, потому что, исходя из документации на fgets(char*buf, int n, FILE *f), fgets читает в буфер buf до тех пора, пока либо:
a) не встретился перевод строки
б) не встретился конец файла
в) не прочитал n-1 символ

У вас длина строки без перевода строки 45, чтобы прочитать строку челиком Вам надо было передавать 46, а Вы передавали 45 - в результате у Вас считывалось 44 символа и 1 оставался не прочитанным (см. п. в)) - это как раз Вы и обрисовали в своем первом посте.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по fgets()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]