Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2012, 21:18   #1
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
Вопрос Чтение из файла, структуры

Добрый вечер. Тут такое дело: хочу заполнить структуру из файла. Но как это правильно сделать ни как не могу понять.
попробовал так
Код:
for (int i=0; i<N; i++)
  {
	fscanf(date,"%s %s %c", &students[i].fam, &students[i].inz, &students[i].pol);
  };
for (int i=0; i<N; i++)
  {
    cout<<students[i].fam<<" "<<students[i].inz<<" "<<students[i].pol<<"\n";
  };
Но выводя эту структуру, получаю такое, как на скриншоте. И по сути сам вопрос - почему циферка считывается дважды ??
Изображения
Тип файла: jpg Снимок.jpg (12.3 Кб, 137 просмотров)
-=M{a}LoY=- вне форума Ответить с цитированием
Старый 09.10.2012, 21:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А файл как выглядит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 21:35   #3
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

// ниуспел но пусть будет
А как они в фале записаны?
Цитата:
Иванов
И.К.1
Петров
Е.А.0
?
Судя потому что первая цифра у тебя до пробела стоит значит она попала в students[i].inz, скорее всего в рез-те fscanf
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 09.10.2012, 21:49   #4
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию

файл txt, в нем все так:
Иванов И.К. 1
Петров Е.А. 0
и т.д.
Ну я так примерно и понял, я попробовал вместо цифры вставить целое слово, но все равно, при выводе это слово так же повторяется(
-=M{a}LoY=- вне форума Ответить с цитированием
Старый 09.10.2012, 21:59   #5
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Честно говоря не пользуюсь [f]scanf совсем и даже удивлен что так все выводит. разбирайся именно со структурой файла + чтением файла.

почитал мануал, у тебя все должно работать, хм...
Пишу на чистом С, плюсы спилил.

Последний раз редактировалось LynXzp; 09.10.2012 в 22:04.
LynXzp вне форума Ответить с цитированием
Старый 09.10.2012, 22:02   #6
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию

Я в С++ новичок, так что пока не очень хорошо все понимаю )
Ладно, буду с файлами разбираться, спасибо
А как кроме [f]scanf можно считывать построчно или по словам, не зная их длины? (На сколько я понимаю [f]gets требует длину слова, а как ее получить я не понял пока)

Последний раз редактировалось -=M{a}LoY=-; 09.10.2012 в 22:06.
-=M{a}LoY=- вне форума Ответить с цитированием
Старый 09.10.2012, 22:06   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Допустим, а как students описана?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 22:26   #8
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию

Код:
const int N = 4;
struct tag_klass
{
	char fam[20];
	char inz[4];
	char pol[1]; 
	int oc_mat;
	int oc_fiz;
	int oc_angl;
} students[N];
Вот так вот)
-=M{a}LoY=- вне форума Ответить с цитированием
Старый 09.10.2012, 23:14   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ясно. Вся проблема в том, что строки в Си оканчиваются символом с кодом 0.
Когда ты считываешь из файла и конвертируешь в строку, то inz у тебя получает инициалы, но после них нет символа с нулевым знаком.
Поэтому в следующем цикле cout благополучно начинает выводить inz, но не находит в нем нуля, и продолжает вывод в том числе и того, что попадает за его пределы, пока не найдет терминатор.
А что у нас следует цугом за inz? Правильно - pol.
Таким образом cout не стесняясь выводит и его следом за inz в одном флаконе.

Спросишь что бы я сделал? Хм... Допустим добавил бы размера полям, хотя бы еще на один символ, что бы считываемая строка не была впритык к массиву символов:
Код:
...
	char inz[5];
	char pol[2];
...
Не скажу что это самое лучшее решение, но все же предлагаю именно его.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 23:23   #10
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию

Ооо .... спасибо огромное ... часа 2 мучился
Да мне это для лабораторной, так что лучше, хуже не имеет значения)
Дальше думаю сумею что то придумать )
-=M{a}LoY=- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение структуры из файла (язык С) SamVImes Помощь студентам 5 20.08.2012 19:18
Чтение структуры из файла! Olegzxc Общие вопросы C/C++ 1 01.12.2011 00:40
Чтение структуры из файла atenon Общие вопросы C/C++ 11 22.10.2010 20:35
Запись структуры и чтение из файла [MI_nor] Общие вопросы C/C++ 6 08.04.2009 15:52
Чтение структуры файла SDK Помощь студентам 4 23.01.2008 19:30