** joynter |
Отправлено: 07.01.2004, 22:16 |
|
Не зарегистрирован
|
Записываю в файл пять текстовых переменных, а правльно читается только последняя. Если
можно, объясните, в чем моя ошибка. Код такой:
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
class MyClass
{
public:
AnsiString s1,s2,s3;
};
TForm1 *Form1;
MyClass s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::buttonSaveClick(TObject *Sender)
{
String buf;
Edit4->Text = "";
Edit5->Text = "";
Edit6->Text = "";
int handle;
//if (FileExists("dat.at"))
// handle = FileOpen("dat.dat",fmOpenWrite);
// else
handle = FileCreate("dat.dat");
for(int i=0;i<5;i++)
{
buf = IntToStr(i);
s.s1 = Edit1->Text + buf;
s.s2 = Edit2->Text + buf;
s.s3 = Edit3->Text + buf;
FileWrite(handle,&s,sizeof(s));
}
FileClose(handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::buttonReadClick(TObject *Sender)
{
int handle;
handle = FileOpen("dat.dat",fmOpenRead);
for (int i=0;i<5;i++)
{
FileRead(handle,&s,sizeof(s));
Edit4->Text = s.s1;
Edit5->Text = s.s2;
Edit6->Text = s.s3;
ShowMessage("next step " + IntToStr(i+1));
}
FileClose(handle);
}
//---------------------------------------------------------------------------
|
|
fellow |
Отправлено: 08.01.2004, 05:55 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 33
|
class MyClass
{
public:
AnsiString s1,s2,s3;
};
Все нормально, каждый экземпляр класса будет содержать три экземпляра AnsiString. AnsiString, напомню, не простой тип, а тоже класс, имеющий члены и помимо собственно текстового буфера.
FileWrite(handle,&s,sizeof(s));
Первая из проблем. Согласно этому коду в файл записывается содержимое памяти по адресу s, причём количество записывыемых байтов равно sizeof(s). Обратите внимание, ни о каких "текстовых" переменных тут и речи нет. Поскольку AnsiString является классом, то напрямую писать содержимое памяти в файл некорректно. В этом случае нужно было бы записывать переменную s почленно, например так:
FileWrite(handle, s.s1.c_str(), s.s1.Length());
FileWrite(handle, s.s2.c_str(), s.s2.Length());
FileWrite(handle, s.s3.c_str(), s.s3.Length());
И этот способ тоже полон недостатков. Тут уж лучше записывать файл собственного формата, например, сначала записывается число-длина строки, потом записывается сама строка. Считывать из файла, соответственно, в том же порядке — сначала длину строки, потом организовывать буфер нужной длины, потом в этот буфер считывать текст, потом буфер передавать переменной типа AnsiString.
FileRead(handle,&s,sizeof(s));
Вторая проблема — зеркальное повторение первой. |
|
Doga |
Отправлено: 08.01.2004, 16:12 |
|
Не зарегистрирован
|
Можно использовать класс TStringList и его функции LoadFromFile и SaveToFile без мороки с созданием файловых потоков (хотя кому как нравится)
------------------------------------
AnsiString s1, s2, s3;
TStringList *List = new TStringList();
List->LoadFromFile("Data.txt");
s1 = List->Strings[0];
s2 = List->Strings[1];
s3 = List->Strings[2];
delete List;
------------------------------------------
TStringList *List = new TStringList();
List->Text = s1 + s2 + s3;
List->SaveToFile(("Data.txt");
delete List;
|
|
|