Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считывание структуры из файла 
V
    Опции темы
console
Дата 1.3.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



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


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 1.3.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

что делать?

понятия не имею. Предлагаешь угадать?
PM MAIL   Вверх
Sartorius
Дата 1.3.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



показать исходник
PM MAIL ICQ   Вверх
console
Дата 1.3.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



Код

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() - собственно функция для вывода данных из структуры

Это сообщение отредактировал(а) console - 1.3.2007, 16:56


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Sartorius
Дата 1.3.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 эээ.... ну я так не играю...  smile целиком покажите. ( здесь-то все ок)
PM MAIL ICQ   Вверх
console
Дата 1.3.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



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


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 1.3.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

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

тут будет каракули выводить
PM MAIL   Вверх
console
Дата 1.3.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



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

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


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 1.3.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

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

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

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

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

буфер как выделяется и коль уж это char* и так как в show_current(a); длина прочитанная не передается, то надобы нуль в конце ставить самому
PM MAIL   Вверх
console
Дата 1.3.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



Структура:

Код

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));




--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Sartorius
Дата 1.3.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

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

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

ЗЫ это наверно какой-то секретный проект. Нам все-таки не хотят показать исходник целиком.
ЗЗЫ почему malloc? На ANSI С пишете?
PM MAIL ICQ   Вверх
console
Дата 1.3.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



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] ?


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
console
Дата 1.3.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



Насчет возврата 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;
}



--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
console
Дата 1.3.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 307
Регистрация: 12.2.2007
Где: Belarus::Minsk

Репутация: 1
Всего: 3



Не решен вопрос с последним полем.... вместе с полезной инфой выводится фигня

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


--------------------
user posted image
Nothing is impossible
My WeBlog
PM MAIL WWW ICQ   Вверх
Pilligrim
Дата 1.3.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 9.6.2006

Репутация: 1
Всего: 1



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

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


Перемещает



Это сообщение отредактировал(а) Pilligrim - 1.3.2007, 20:52
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2046 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.