C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запись структуры в файл, char
lonejan
  Отправлено: 23.03.2007, 16:08


Ученик-кочегар

Группа: Участник
Сообщений: 4



Есть структура
CODE
struct rs {
       char index[30];
       float rest;
       float reserve;
};

Выбираются товары из базы, заполняется структура, index — имя товара, может варьироватся от 5-25 символов, потом структура сохраняется в файл в цикле. Товаров выбирается около 150000, и очень не многе из них имеют наименование в 25 символов, большинство 5-12. Программа предназначена для обмена остатками товарами между филиалами по FTP, и размер файла очень важен. Как можно уменьшить размер файла? Я уже думал побайтно писать файл, и перед наименованием указывать его размер, но уж очень хочется пользоватся структурами.
Guest
Отправлено: 23.03.2007, 16:58


Не зарегистрирован







паковать файл перед отправкой
lonejan
Отправлено: 23.03.2007, 17:20


Ученик-кочегар

Группа: Участник
Сообщений: 4



Это понятно, но всё же, можно как то менять размер чара в структуре?
bred
Отправлено: 23.03.2007, 17:56


Ученик-кочегар

Группа: Участник
Сообщений: 15



QUOTE (lonejan @ 23.03.2007, 17:20)
Это понятно, но всё же, можно как то менять размер чара в структуре?

можно попытатся ввести в структуру поле — размер структуры т.е. на приемном конце что-то типа:
CODE

struct MyStruct
   {
     int LenStr;
     float rest;
     float reserv;
     char* Str;
    }

ну и придется написать процедурку записи в файл и чтения из негоwink.gif
Ramzay
Отправлено: 23.03.2007, 20:00


Дежурный стрелочник

Группа: Участник
Сообщений: 31



CODE
struct MyStruct
  {
    int LenStr;
    float rest;
    float reserv;
    char* Str;
   }

И вместо наименования товара будет передаваться адрес строки, что то типа 00F9C85.
Тут нужно уходить от структуры. Структура сама по себе имеет фиксированную длину. Тебе нужно уходить от структуры и формировать строки переменной длины, которые заканчиваются разделитилями.

Упаковка данных решила бы все проблемы, даже при использовании строк фиксированной длины, т.е. такой структуры как ты описал.
Admin
Отправлено: 23.03.2007, 21:06


Владимир

Группа: Администратор
Сообщений: 1190



По моему правильно написал bred:

CODE

struct MyStruct
{
short LenStr; // количество байт в строке
float rest;
float reserv;
char* Str; // указатель начала строки
}s;


В цикле пробегаеми по строкам смотрим LenStr текущей строки, выделяем память под строку s.Str = new char[s.LenStr+1];
записываем в файл.

CODE

    s.LenStr = Edit1->Text.Length();
    if(s.LenStr ){
         s.Str = new char[s.LenStr+1];
         s.Str[s.LenStr] = 0;
         strcpy(s.Str,Edit1->Text.c_str());
         }


При чтении файла действуем также — смотрим LenStr и если не 0,
выделяем память для чтения нужного количества байт.

Также прав и Guest — упаковываете файл перед отправкой в zip
а там его будут предварительно распаковывать из zip.

Вернуться в Вопросы программирования в C++Builder