Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Считывание структуры из файла


Автор: console 1.3.2007, 16:46
Записываю структуру с разнородными полями в файл... записывается нормально... Когда считываю и вывожу на экран, выводятся еще лишние символы-кракозяблики... что делать?

Автор: Fazil6 1.3.2007, 16:48
Цитата

что делать?

понятия не имею. Предлагаешь угадать?

Автор: Sartorius 1.3.2007, 16:48
показать исходник

Автор: console 1.3.2007, 16:53
Код

fileptr=fopen("c:\\struct.txt","r"); //открываем файл для чтения
 
 for(int q=0;q<(filesize()/structsize);q++)
  if(fread(a,1,structsize,fileptr)!=1)
  {
   printf("Произошла ошибка при считывании из файла...");
   getch();
   mainmenu();
  }
  else
  {
    show_current(a);
    getch();
  } 




structsize - переменная int типа, содержащая размер структуры
fileptr - указатель на файл
filesize() - функция для вычисления размера файла
a - указатель на динамич память для структуры
show_current() - собственно функция для вывода данных из структуры

Автор: Sartorius 1.3.2007, 16:57
 эээ.... ну я так не играю...  smile целиком покажите. ( здесь-то все ок)

Автор: console 1.3.2007, 16:59
В остальном все ок... 
Менюшка... выбираем - "Вывести все данные на экран" и запускается функция showall()  {с содержанием, моего предыдущего поста}

Автор: Fazil6 1.3.2007, 17:01
Код

printf("Произошла ошибка при считывании из файла...");

тут будет каракули выводить

Автор: console 1.3.2007, 17:03
Каракули выводит при выводе собственно инфы из файла

Добавлено @ 17:03 
я в DOS-кодировке пишу... так что все ок с рус

Автор: Fazil6 1.3.2007, 17:07
Цитата

Каракули выводит при выводе собственно инфы из файла

я повторяю : ты хочешь чтобы угадали? Покажи что ты выводишь, как выводишь. Русский текст будет каракулями выводится.
Как инфа в файле хранится, может надо не в текстовом режиме открывать? Как structsize вычисляется? Кроме данных в файле ведь еще всякие переносы строк могут быть...

Добавлено @ 17:12 
Код

if(fread(a,1,structsize,fileptr)!=1)

буфер как выделяется и коль уж это char* и так как в show_current(a); длина прочитанная не передается, то надобы нуль в конце ставить самому

Автор: console 1.3.2007, 17:14
Структура:

Код

typedef struct abc
{
char subject[15];
char imya[18];
char familiya[30];
char otchestvo[30];
char cat[2];
int stazh;
char inGroup[50];
char address[40];
char phone[7];
}structure;


Вычисления размера структуры:

Код

structsize=sizeof(structure);


Функция записи структуры в файл:

Код

void add_rec(structure* p)
{
clrscr();
printf("Введите фамилию:\n");
scanf("%s",p->familiya);
printf("\nВведите имя:\n");
scanf("%s",p->imya);
printf("\nВведите отчество:\n");
scanf("%s",p->otchestvo);
printf("\nВведите предмет:\n");
scanf("%s",p->subject);
printf("\nВведите категорию:\n");
scanf("%s",p->cat);
printf("\nВведите стаж:\n");
scanf("%d",&(p->stazh));
printf("\nВведите список групп:\n");
scanf("%s",p->inGroup);
printf("\nВведите адрес:\n");
scanf("%s",p->address);
printf("\nВведите телефон:\n");
scanf("%s",p->phone);

fileptr=fopen("c:\\struct.txt","a+"); 

if(fwrite(a,sizeof(*a),1,fileptr)==1)
 printf("\nЗапись успешно добавлена\n");else
 printf("\nПроизошла ошибка при попытке записи\n");
}


Функция вычисления размера файла:

Код

long filesize()
{
 long Filesize;
 fileptr=fopen("c:\\struct.txt","r");
 fseek(fileptr,0,SEEK_END);
 Filesize=ftell(fileptr);
 return Filesize;
}


Добавлено @ 17:15 
Буфер:

Код
a=(structure*)malloc(sizeof(structure));


Автор: Sartorius 1.3.2007, 17:21
Цитата

fwrite(a,sizeof(*a),1,fileptr))

почему а, когда там везде p?

ЗЫ это наверно какой-то секретный проект. Нам все-таки не хотят показать исходник целиком.
ЗЗЫ почему malloc? На ANSI С пишете?

Автор: console 1.3.2007, 17:25
Sartorius, очень секретный ))))  smile  


Цитата(Sartorius @  1.3.2007,  17:21 Найти цитируемый пост)
На ANSI С пишете?

Да...


Цитата(Sartorius @  1.3.2007,  17:21 Найти цитируемый пост)
почему а, когда там везде p?

Глобальный указатель...

Код

structure* a;


Добавлено @ 17:27 
Кстати... fread() возвращает не единицу... проблема

Добавлено @ 17:36 
Цитата(Fazil6 @  1.3.2007,  17:07 Найти цитируемый пост)
то надобы нуль в конце ставить самому

Отчего тогда в остальных полях ничего не вылазит, а лишь в поле char phone[7] ?

Автор: console 1.3.2007, 18:12
Насчет возврата fread() разобрался:

Пример с http://www.cplusplus.com/

Код

/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

Автор: console 1.3.2007, 18:35
Не решен вопрос с последним полем.... вместе с полезной инфой выводится фигня

Добавлено @ 18:45 
Размер последнего поля увеличил на единицу, теперь все ок...
Возникла другая проблема...
При считывании (если в файле больше одной структуры) выводится всегда первая.... Тут наверное дело с указателем в файле..... fread() разве не перемещает его?

Автор: Pilligrim 1.3.2007, 20:50
console, легче: записывай структуру в файл почленно и считывай соответственно так же. Во-первых, уменьшишь размер файла(избежишь так называемого выравнивания в структуре), а во-вторых просто легче будет: избежишь лишних проблем)))

Цитата
Тут наверное дело с указателем в файле..... fread() разве не перемещает его?


Перемещает


Автор: Dimonius 1.3.2007, 21:27
Просвещаемся http://www.kalinin.ru/programming/cpp/31_07_00.shtml

Автор: console 1.3.2007, 23:01
Все ок... считывается....  smile 

Вся загвоздка состояла в том, что файл одновременно 2 раза открывался... smile 

Всем огромное спасибо за советы, поправки и терпение...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)