Как этот массив сохранить в файл, используя FileWrite?
Я пишу FileWrite( iFile, Infos, sizeof( Infos ) ) но видать это неправильно, потому что когда я все это дело открываю FileOpen'ом, то в массив ничего не записывается. Помогите, плиз!
Да, я еще писал FileWrite( iFile, Infos, sizeof( Info ) * 1000 ), но тоже не помогло.
По-моему, ничего не сохраняется из-за того, что sizeof неправильно определяет размер Info, потому что в нем AnsiString'и.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT> А на зачем тебе FileWrite, массив, да и, собс-но, str и str1?
LT> Возьми TStringList, четные строки будут тебе str, LT> а нечетные — str1. Ну и сохраняй SaveToFile.
Да потому что на самом деле в классе Info есть еще другие члены:
class Info
{
public:
AnsiString str, str1;
TTreeNode *Node;
int Count;
}
Здравствуйте, Zi56, Вы писали:
LT>> А на зачем тебе FileWrite, массив, да и, собс-но, str и str1?
Z>Да потому что на самом деле в классе Info есть еще другие члены: Z>class Info Z>{ Z>public: Z> AnsiString str, str1; Z> TTreeNode *Node; Z> int Count; Z>}
Здравствуйте, Zi56, Вы писали:
Z>Спасибо, но там говорится о том, как сохранить TreeView. Мне это не нужно, нужно просто сохранить вышеупомянутый мной класс.
А разве все, что я хочу, не делается FileWrite'ом, или каким-нить другим, но достаточно простым способом (т.к. прога у меня очень простая)? Ну уж очень не хочется юзать TWriter/TReader.
Здравствуйте, 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.
Здравствуйте, Zi56, Вы писали:
Z>Здравствуйте, Leonid Troyanovsky, Вы писали:
Z>А разве все, что я хочу, не делается FileWrite'ом, или каким-нить другим, но достаточно простым способом (т.к. прога у меня очень простая)? Ну уж очень не хочется юзать TWriter/TReader.
Можно ессесно.
Можно попробовать сохранить твои объекты в ini-файл, каждый объект в свою секцию.