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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2011, 19:05   #1
DR&FG
 
Регистрация: 24.10.2009
Сообщений: 5
По умолчанию Чтение/запись структур в файл

Здравствуйте.
Имеется структура вида
Код:
struct str
{
	char szName[25];
	int iNumber;
	double dNumber;
};
В процессе работы программы создается динамический массив типа str, и записывается в бинарный файл: сначала количество элементов в массиве, а потом сами элементы один за одним.

Код:
	the_str= new str[kol];
	// заполняем массив....................
	FILE *f;
	f= fopen (path,"wb");
	if (!f) return false;
	fprintf(f,"%d",kol);
	for (int i=0; i<kol; i++)
	{
		fprintf(f,"%-25s",the_str[i].szName);
		fprintf(f,"%d",the_str[i].iNumber);
		fprintf(f,"%lf",the_str[i].dNumber);
	}
	fclose(f);
Проблема в том, что числа пишутся в файл в 10-ичной системе счисления, и заранее узнать сколько позиций занимает данное число невозможно. То есть число "23" занимает 2 позиции, а "65535" уже 5.
Собственно вопрос, как мне теперь открыть файл и прочитать i-ую запись, если все структуры, записанные в файл имеют разную фактическую длинну?
Нельзя ли упаковывать в файл структуры так, как они хранятся в памяти? (про выравнивание я молчу)

Последний раз редактировалось DR&FG; 22.01.2011 в 19:43.
DR&FG вне форума Ответить с цитированием
Старый 22.01.2011, 19:17   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

1. int меняешь на int32_t, int64_t
2. __attribute__((__packed__))
3. sizeof( your_class ) * count
4. fopen + fwrite

годится для классов без наследования
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 22.01.2011, 19:29   #3
DR&FG
 
Регистрация: 24.10.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
1. int меняешь на int32_t, int64_t
2. __attribute__((__packed__))
3. sizeof( your_class ) * count
4. fopen + fwrite

годится для классов без наследования
1. А что принципиального в int32_t, int64_t ? чем short int с long int хуже не пойму.
2. __attribute__((__packed__)) служит для отключения выравнивания в структурах при хранении в памяти, меня это мало волнует, Вы мне скажите как в файле их выравнивать
3. Ну да, именно столько информации в идеале стоит записывать в файл в моем случае, я к этому стремлюсь
4. А чем FILE функции шуже? они конечно древние как какашки мамонта, но работают ничуть не хуже
Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
1. размер int может различаться на разных системах, размер int32_t известен
Это мне известно. Моя программа не рассчитана на кроссплатформенную работу, на моей бы машине заработала, а там посмотрим. Будем считать что sizeof int == 2

Последний раз редактировалось DR&FG; 22.01.2011 в 19:39.
DR&FG вне форума Ответить с цитированием
Старый 22.01.2011, 19:34   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

1. размер int может различаться на разных системах, размер int32_t известен
на остальное ответить не успеваю, надо бежать
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 22.01.2011, 19:49   #5
DR&FG
 
Регистрация: 24.10.2009
Сообщений: 5
По умолчанию

Нашел исчерпывающий ответ здесь http://www.kalinin.ru/programming/cpp/31_07_00.shtml
Тему можно закрывать.
DR&FG вне форума Ответить с цитированием
Старый 22.01.2011, 20:01   #6
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

Можно так попробовать

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct str
{
	char szName[25];
	int iNumber;
	double dNumber;
}str;

int main(void)
{
    FILE *fp;
    str s,d;
    s.dNumber = 0.0001;
    s.iNumber = 23;
    strcpy(s.szName, "test write");
    if((fp = fopen("same_file", "wb+")) == NULL) 
    {
        printf("Error open file.\n");
        exit(1);
    }
    fwrite(&s, sizeof(str), 1, fp);
    rewind(fp);
    fread(&d, sizeof(str), 1, fp);

    fclose(fp);
    printf("%f, %d, %s", d.dNumber, d.iNumber, d.szName);

    return 0;
}
like-nix вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись в файл Dycek Общие вопросы C/C++ 0 18.01.2011 15:04
Чтение и запись в файл. Ky3Heu, Помощь студентам 0 01.01.2010 11:24
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11
Чтение/запись в файл в StringGrid SVadiks Помощь студентам 0 03.12.2009 22:14
Считывание и запись структур в бинарный файл TheKnyazz Общие вопросы C/C++ 7 10.11.2009 13:47