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;
}
//---------------------------------------------------------------------------
|
Наверное можно все это записать и проще, подумайте как и сделайте.
Такие вопросы лучше думать и решать самим, не вынося на форум,
как это сделать — программист должен ДУМАТЬ САМ !
|
|