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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2011, 21:58   #1
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию Считать из файла структуры и вывести

Доброго времени суток! У меня такая проблема: некорректное считывание структур из файлов и вывод их содержимого на экран.
У меня есть 2 массива структур, которые определены следующим образом:
Код:
struct sved1
{
char name[20], ed_izmer[10];
int count, art;
}invent1[30];

struct sved2
{
char name[20], operation[20];
int date[20][3];
}invent2[30];
Поля name у них одинаковые. В файлах f1 и f2 есть данные, занесенные в ходе выполнения программы (т.е. я ввожу данные в структуры, записываю их в файлы (1-ую структуру в 1-ый файл, 2-ую во 2-ой), а потом нужно их считать. Самое интересное, что у меня это получается, но если в начале выполнения программы просто попытаться считать данные из файлов, в которых уже что-то есть, то уже считывается неправильно). Надеюсь, что понятно изложил суть проблемы, а теперь код
Код:
while(fread(&invent1[i],sizeof(invent1[i]),1,f1))
    {
	printf("\n%s",invent1[i].name);
	printf("  %s",invent1[i].ed_izmer);
	printf("  %d",invent1[i].art);
	printf("  %d",invent1[i].count);
	while(fread(&invent2[i],sizeof(invent2[i]),1,f2))
	{
	sved2* d=(sved2*)malloc(sizeof(invent2[i].date));
	sved2* t=(sved2*)malloc(sizeof(invent2[i].operation));
	fread(d->date,sizeof(invent2[i].date),10,f2);
	fread(t->operation,sizeof(invent2[i].operation),10,f2);
	for (k=0; k<10; k++)
	 {
	   printf("  %d.%d.%d | ",invent2[i].date[k][0],invent2[i].date[k][1],invent2[i].date[k][2]);
	   printf("%c - %d  ",invent2[i].operation[k], A[i][k]);
	 }
	 free(d); free(t);
	}
	printf("\n-----------------------\n");
	i++;
    }
Проблема во второй структуре, т.е. operation и date выводятся неправильно (а точнее просто не выводятся). Буду благодарен, если кто-нибудь поможет
P.S. значение "10" я взял произвольно))
Shadow94 вне форума Ответить с цитированием
Старый 22.05.2011, 23:00   #2
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Код:
sved2* t=(sved2*)malloc(sizeof(invent2[i].operation));
Под структуру в 100 байт вы выделяете 20.

Код:
fread(t->operation,sizeof(invent2[i].operation),10,f2);
В поле размером 20 байт считывается 10 раз по 20 байт.

С sved1 примерно также.
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 23.05.2011, 00:18   #3
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию

Dayman, спасибо, теперь понятно
Исправил, но всё равно не работает, с первой структурой всё нормально, а поля второй структуры (дата и операции) - нули...
Если я всё правильно понял про выделение памяти, то ошибка скорее всего в "красных" строчках. Хотя странно, как по-другому то выводить данные)
Код:
int N[3];
   while(fread(&invent1[i],sizeof(invent1[i]),1,f1))
    {
	printf("\n%s",invent1[i].name);
	printf("  %s",invent1[i].ed_izmer);
	printf("  %d",invent1[i].art);
	printf("  %d",invent1[i].count);
	sved2 *str2=(sved2*)malloc(sizeof(invent2[i].operation)+sizeof(invent2[i].name)+sizeof(invent2[i].date));
	fread(str2->date,sizeof(invent2[i].date),1,f2);
	fread(str2->operation,sizeof(invent2[i].operation),1,f2);
	for (k=0; k<3; k++)
	 {
	   fread(&N[k],sizeof(int),1,f2);
	   printf("  %d.%d.%d | ",invent2[i].date[k][0],invent2[i].date[k][1],invent2[i].date[k][2]);
	   printf("%c - %d  ",invent2[i].operation[k], N[k]);
	 }
	 free(str2);
	printf("\n-----------------------\n");
	i++;
    }
Shadow94 вне форума Ответить с цитированием
Старый 23.05.2011, 20:45   #4
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Может вам в дебаггере проще будет посмотреть, что записано в структуру, чем через printf?
Что printf выводить должен?
Код:
printf(" %d.%d.%d | ",invent2[i].date[k][0],invent2[i].date[k][1],invent2[i].date[k][2]);
Тут, как мне кажется, %d надо заменить на %s, иначе получается, что вы выводите первый символ поля date[k][0..2]
Даже не так, получается, что вы выводите адрес указателя на date[k][0..2]
Код:
char* sss="random string\0"; printf("%d\n",sss); // 4206704 - sss pointer printf("%d\n",sss[0]); // 114 ASCII первого символа printf("%d\n",&sss[0]); // 4206704 sss pointer printf("%s\n",&sss[0]); // random string
Lingua c++ non penis caninus est.

Последний раз редактировалось Dayman; 23.05.2011 в 20:59.
Dayman вне форума Ответить с цитированием
Старый 23.05.2011, 21:12   #5
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию

Но у меня же поле date это дата, она в числовом формате представлена, а не в строковом, так что мне кажется, проблема в другом. Возможно ли такое, что с файла дата считалась неправильно, т.е. может быть дата в одном месте, а считывание шло с другого места? Хотя я же записываю всю структуру разом, и считываю тоже всю структуру, так что всё должно быть правильно... Или я опять чего-то недопонимаю)
Shadow94 вне форума Ответить с цитированием
Старый 23.05.2011, 21:58   #6
Dayman
Форумчанин
 
Аватар для Dayman
 
Регистрация: 12.01.2011
Сообщений: 186
По умолчанию

Цитата:
Сообщение от Shadow94 Посмотреть сообщение
Но у меня же поле date это дата
действительно
i у вас до 30 идет?
Если да, то работает ли это:
Код:
fread(invent1,sizeof(invent1),1,f1);
fread(invent2,sizeof(invent2),1,f2);
for(int i=0;i<30;i++){
	printf("\n%s",invent1[i].name);
	printf("  %s",invent1[i].ed_izmer);
	printf("  %d",invent1[i].art);
	printf("  %d",invent1[i].count);
	for(int k=0; k<10; k++)
		printf("  %d.%d.%d | ",invent2[i].date[k][0],invent2[i].date[k][1],invent2[i].date[k][2]);
}
Lingua c++ non penis caninus est.
Dayman вне форума Ответить с цитированием
Старый 23.05.2011, 23:55   #7
Shadow94
Пользователь
 
Аватар для Shadow94
 
Регистрация: 17.04.2011
Сообщений: 18
По умолчанию

Цитата:
i у вас до 30 идет?
Не обязательно, i это ведь количество структур, в файле их может быть не 30, а меньше, т.е. считывание идет пока есть структуры
Ну код всё равно работает не так как надо, хотя уже ближе к истине, надо или отладчиком пройтись или ещё думать, как можно правильно считать и вывести структуры. Эх, если бы не бинарный файл...
Shadow94 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считать строчку из файла erro Общие вопросы C/C++ 11 08.03.2011 16:49
считать строку из файла Farrel Общие вопросы C/C++ 1 09.12.2010 01:47
как считать файл и вывести его на экран B@R@B@$HK@ Общие вопросы C/C++ 3 16.06.2009 19:14
Динамически считать Данные из файла, и вывести результат в файл StudeHt Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 09:04
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27