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

 
Проблема с чтенем из файла, Проблема с чтенем из файла
** 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;



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