Как сохранить в файл массив с AnsiString?
От: Zi56  
Дата: 28.03.04 14:29
Оценка:
Пишу программу в Билдере 6.0. Есть класс:
class Info
{
public:
   AnsiString str, str1;
}


Потом делаю массив:
Info *Infos = new Info[1000];


Как этот массив сохранить в файл, используя FileWrite?
Я пишу FileWrite( iFile, Infos, sizeof( Infos ) ) но видать это неправильно, потому что когда я все это дело открываю FileOpen'ом, то в массив ничего не записывается. Помогите, плиз!
Re: Как сохранить в файл массив с AnsiString?
От: Zi56  
Дата: 28.03.04 14:32
Оценка:
Да, я еще писал FileWrite( iFile, Infos, sizeof( Info ) * 1000 ), но тоже не помогло.
По-моему, ничего не сохраняется из-за того, что sizeof неправильно определяет размер Info, потому что в нем AnsiString'и.
Re: Как сохранить в файл массив с AnsiString?
От: Leonid Troyanovsky  
Дата: 28.03.04 14:49
Оценка:
Здравствуйте, Zi56, Вы писали:

Z>Пишу программу в Билдере 6.0. Есть класс:

Z>
Z>class Info
Z>{
Z>public:
Z>   AnsiString str, str1;
Z>}
Z>


Z>Потом делаю массив:

Z>
Z>Info *Infos = new Info[1000];
Z>


Z>Как этот массив сохранить в файл, используя FileWrite?


А на зачем тебе FileWrite, массив, да и, собс-но, str и str1?

Возьми TStringList, четные строки будут тебе str,
а нечетные — str1. Ну и сохраняй SaveToFile.
--
С уважением, LVT
Re[2]: Как сохранить в файл массив с AnsiString?
От: Zi56  
Дата: 28.03.04 14:58
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT> А на зачем тебе FileWrite, массив, да и, собс-но, str и str1?


LT> Возьми TStringList, четные строки будут тебе str,

LT> а нечетные — str1. Ну и сохраняй SaveToFile.

Да потому что на самом деле в классе Info есть еще другие члены:
class Info
{
public:
AnsiString str, str1;
TTreeNode *Node;
int Count;
}
Re[3]: Как сохранить в файл массив с AnsiString?
От: Leonid Troyanovsky  
Дата: 28.03.04 16:07
Оценка:
Здравствуйте, Zi56, Вы писали:

LT>> А на зачем тебе FileWrite, массив, да и, собс-но, str и str1?


Z>Да потому что на самом деле в классе Info есть еще другие члены:

Z>class Info
Z>{
Z>public:
Z> AnsiString str, str1;
Z> TTreeNode *Node;
Z> int Count;
Z>}

By Peter Below
--
С уважением, LVT
Re[4]: Как сохранить в файл массив с AnsiString?
От: Zi56  
Дата: 28.03.04 16:39
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:
<skipped>

Спасибо, но там говорится о том, как сохранить TreeView. Мне это не нужно, нужно просто сохранить вышеупомянутый мной класс.
Re[5]: Как сохранить в файл массив с AnsiString?
От: Leonid Troyanovsky  
Дата: 28.03.04 17:01
Оценка:
Здравствуйте, Zi56, Вы писали:

Z>Спасибо, но там говорится о том, как сохранить TreeView. Мне это не нужно, нужно просто сохранить вышеупомянутый мной класс.


http://groups.google.com/groups?selm=VA.00001f87.18ea676b%40mikemain

Обрати внимание на то, что говорится про published.
Ну, и, ясен пень, что твоим указателям нечего делать в stream.
--
С уважением, LVT
Re[6]: Как сохранить в файл массив с AnsiString?
От: Zi56  
Дата: 28.03.04 17:31
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

А разве все, что я хочу, не делается FileWrite'ом, или каким-нить другим, но достаточно простым способом (т.к. прога у меня очень простая)? Ну уж очень не хочется юзать TWriter/TReader.
Re[7]: Как сохранить в файл массив с AnsiString?
От: Leonid Troyanovsky  
Дата: 28.03.04 18:13
Оценка:
Здравствуйте, Zi56, Вы писали:

Z>А разве все, что я хочу, не делается FileWrite'ом, или каким-нить другим, но достаточно простым способом (т.к. прога у меня очень простая)? Ну уж очень не хочется юзать TWriter/TReader.


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

Ну, а дальше, все просто.
Вот, например, как можно хранить информацию о строках и др.

type
   TMyRec = packed record
      Id: Longint; // номер записи
      TreeNodeIdx: Longint; // ссылка на другую запись
      {другие поля фиксированной длины}
      Size: Longint; // размер буфера для строк
      str1Len: Longint; // длина первой строки
      buffer: array [0..0] of Char; // начало буфера 
   end;


Т.е., читая первую запись, мы определяем длину переменной части Size
и считываем в буфер строки, разделяя их по длине. Далее следующую, и т.д.
Сохраняем в обратном порядке: определяем размер буфера для строк,
выделяем память для TMyRec + буфер, заполняем, записываем.

Вообще, же, если оных записей много, и они еще и меняются, то лучше
сразу выбрать хранилище типа IStorage.
--
С уважением, LVT
Re[7]: Как сохранить в файл массив с AnsiString?
От: Dimonka Верблюд  
Дата: 28.03.04 18:49
Оценка:
Здравствуйте, Zi56, Вы писали:

Z>Здравствуйте, Leonid Troyanovsky, Вы писали:


Z>А разве все, что я хочу, не делается FileWrite'ом, или каким-нить другим, но достаточно простым способом (т.к. прога у меня очень простая)? Ну уж очень не хочется юзать TWriter/TReader.

Можно ессесно.
Можно попробовать сохранить твои объекты в ini-файл, каждый объект в свою секцию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.