файлы и Билдер
короче - пишется в файл структура вида
struct structName
{
int nVar;
AnsiString str;
}structVar;
пишется стандартной АПИ
WriteFile(hFileHandle,structVar,&dwCount,NULL);
целая переменная пишется нормально, а вместо строки пишется как я понял ее адрес (что логично)
поэтому после перезапуска программы читается из файла фигня всякая... :(
помогите кто чем может. спасибо!
Запись в файл - тема большая. Именно для Вашего случая нужно писать в файл не саму AnsiString, а её содержимое, т.е. AnsiString::c_str(). Большое значение имеет также формат файла, т.к. если пихать туда int и строки вперемешку довольно просто, то читать обратно в нужной последовательности будет посложнее.
Благодарен за совет, однако! если использовать AnsiString::c_str(), то этот вариант испробован. вроде получается. но читает по прежнему с проблемами
Благодарен за совет, однако! если использовать AnsiString::c_str(), то этот вариант испробован. вроде получается. но читает по прежнему с проблемами
Именно это я и имел в виду, говоря о необходимости тщательно продумывать формат файла. Например, запись Ваших структур можно производить в текстовый файл построчно:
"3245"
"Строка текста из первой переменной"
"4352"
"Строка текста из второй половины".
При этом нужно пользоваться не WriteFile, которая очень мощная, но слишком низкоуровневая, а средствами форматированного ввода-вывода (потоками) стандартной библиотеки. Для файлов это будут классы ifstream для ввода и ofstream для вывода. У этих классов есть всё необходимое для поддержки вывода и ввода сложных структур данных.
помоги чайнику и он перестанет быть чайником :)
Еще раз спасибо...
Спасибо за Ваш совет, и участие в моей проблеме.
помоги чайнику и он перестанет быть чайником :)
Еще раз спасибо...
Если надо читать и писать в файл можно использовать примерно вот такое:
struct Client{
char Code[5];
char Name[20];
char Address[256];
char EMail[25];
char Telephon[15];
char Fax[15];
char INN[15];
char MFO[15];
char Schet[15];
int __fastcall WriteClient(ofstream& stream);
int __fastcall ReadClient(ifstream& stream);
};
int __fastcall Client::ReadClient(ifstream& stream){
filebuf *file;
file = stream.rdbuf();
int f = file->fd();
::read(f,Code,sizeof(Code));
::read(f,Name,sizeof(Name));
::read(f,Address,sizeof(Address));
::read(f,EMail,sizeof(EMail));
::read(f,Telephon,sizeof(Telephon));
::read(f,Fax,sizeof(Fax));
::read(f,INN,sizeof(INN));
::read(f,MFO,sizeof(MFO));
::read(f,Schet,sizeof(Schet));
return sizeof(Client);
}
int __fastcall Client::WriteClient(ofstream& stream){
filebuf *file = stream.rdbuf();
int f = file->fd();
::write(f,Code,sizeof(Code));
::write(f,Name,sizeof(Name));
::write(f,Address,sizeof(Address));
::write(f,EMail,sizeof(EMail));
::write(f,Telephon,sizeof(Telephon));
::write(f,Fax,sizeof(Fax));
::write(f,INN,sizeof(INN));
::write(f,MFO,sizeof(MFO));
::write(f,Schet,sizeof(Schet));
return sizeof(Client);
}
ofstream filein("file.dat",ios::ate|ios::binary);//открытие на запись
//записыват один объект в конец файла
Client client;
client.WriteClient(filein);
ifstream fileout("file.dat",ios::nocreate|ios::binary);//открытие на чтение
fileout.seekg(0,ios::end);
int sizefile = fileout.tellp();
int beg,seek = 0;
beg =sizeof(client);
fileout.clear();
while(sizefile>0){
client.ReadClient(fileout);
sizefile-=beg;
seek +=beg;
fileout.seekg(seek);
//Выполнение необходимой обработки объекта
}
Пишется и считывается без всяких проблем. Дополнительные переменные можно убрать и код значительно упростить...Можно изменять состояние потока. Этот вариант особенно удобен когда надо записывать или считывать в несколько файлов или несколько различных объектов.
Я пытался перегружать оператор << и >> - но это решение оказалось немного проще и эффективней. Для двоичных файлов по крайней мере.