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

 
Очень интересно. Запись и чтение в файл., (двойное или даже тройное дно файла)
Young Coder
Отправлено: 28.06.2003, 19:22


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

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



Вот. Програмил я прикладуху.
Писал определенные данные сначала в два, а потом в три файла.
И только потом собразил, что мне надо все хранить в одном файле.
Ну например есть три Memo.
Загрузить из файла текст в мемо — пять секунд.
А если (как в моем случае) надо загрузить в мемо только часть файла?
Что посоветуете, господа знатоки?

С респектами...
RedMammoth
Отправлено: 28.06.2003, 21:37


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







Простого решения (в одну функцию типа LoadFromFile) я тут не усматриваю. Я бы посоветовал с IStorage разобраться... или с RIFF. Или свою процедурку написать. Масса вариантов...
Young Coder
Отправлено: 28.06.2003, 21:43


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

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



Это понятно, просто вопрос наверно стоит поставить так:
как прочитать из файла часть текста например если сделать какие-то метки.
Георгий
Отправлено: 29.06.2003, 02:25


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



можно сделать потомка от TFileStream и в нём читать:
CODE
class MyFileStream:public TFileStream
{
public:
MyFileStream(const AnsiString FileName, Word Mode):TFileStream(FileName,Mode){};
virtual int __fastcall Read(void *Buffer, int Count)
{
return TFileStream::Read(Buffer,100);
};
virtual bool __fastcall SetBlock(int BlockN)
{
return (BlockN*100)==this->Seek(BlockN*100,soFromBeginning);
};
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MyFileStream *mfs=new MyFileStream("d:\\a.ini",fmOpenRead|fmShareDenyNone);
mfs->SetBlock(1);
this->Memo1->Lines->LoadFromStream(mfs);
delete mfs;
}
т.к. критерий, по которому можно выбрать нужную часть файла, не был назван, то тут я предположил, что файл разбит на части по 100 байт и ввёл метод для выбора нужной части — SetBlock. Код, как Вы видите, очень компактный, не сложный и решает поставленную задачу.

в принципе задача построения структурированного файла с заранее не известной структурой — это часть задачи построения файла БД (по крайней мере реляционной).

Отредактировано Георгий — 29 Jun 2003, 02:26
Admin
Отправлено: 29.06.2003, 16:49


Владимир

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



Если все так просто — 3 Memo и 1 файл, незачем и извращаться,
пусть так и будет.

Для себя решаете — что у вас будет разделителем в файле,
например строка "*1*" и т.д.

Когда надо записать из 3 Memo в файл, пишем,
вставляя эти разделители.

CODE

//---------------------------------------------------------------------------
// Save 3 Memo in 1 file
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   TStringList* nf = new TStringList();

   nf->Add("*1*");
   nf->AddStrings(Memo1->Lines);
   nf->Add("*2*");
   nf->AddStrings(Memo2->Lines);
   nf->Add("*3*");
   nf->AddStrings(Memo3->Lines);
   nf->Add("*end*");

   nf->SaveToFile("myFile.txt");
   delete nf;
}
//---------------------------------------------------------------------------


Далее читаем из текстового файла и раскидываем в 3 Memo

CODE

//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
    TStringList* nf = new TStringList();
    nf->LoadFromFile("myFile.txt");
    Memo1->Lines->Clear(); Memo2->Lines->Clear(); Memo3->Lines->Clear();

    int flag = 0;  int ns;
    for(int i=0; i<nf->Count; i++){
       if(flag == 0 && nf->Strings[i] == "*1*") flag = 1;
       if(flag == 1 && nf->Strings[i] == "*2*") {
          for(int j=1; j<i; j++) Memo1->Lines->Add(nf->Strings[j]);
          flag = 2;   ns = i+1;
          }
       if(flag == 2 && nf->Strings[i] == "*3*"){
          for(int j=ns; j<i; j++) Memo2->Lines->Add(nf->Strings[j]);
          flag = 3;   ns = i+1;
          }
       if(flag == 3 && nf->Strings[i] == "*end*"){
          for(int j=ns; j<i; j++) Memo3->Lines->Add(nf->Strings[j]);
          }
       }

    delete nf;
}
//---------------------------------------------------------------------------


Наверное можно все это записать и проще, подумайте как и сделайте.
Такие вопросы лучше думать и решать самим, не вынося на форум,
как это сделать — программист должен ДУМАТЬ САМ !


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