Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

файлы и Билдер

2
18 августа 2003 года
squirL
5.6K / / 13.08.2003
я программист малоопытный, поэтому не судите строго. я недавно взялся за билдер, и как начал делать первую прогу, пишущую в файл...
короче - пишется в файл структура вида
struct structName
{
int nVar;
AnsiString str;
}structVar;

пишется стандартной АПИ
WriteFile(hFileHandle,structVar,&dwCount,NULL);

целая переменная пишется нормально, а вместо строки пишется как я понял ее адрес (что логично)
поэтому после перезапуска программы читается из файла фигня всякая... :(
помогите кто чем может. спасибо!
310
18 августа 2003 года
fellow
853 / / 17.03.2003
Запись в файл - тема большая. Именно для Вашего случая нужно писать в файл не саму AnsiString, а её содержимое, т.е. AnsiString::c_str(). Большое значение имеет также формат файла, т.к. если пихать туда int и строки вперемешку довольно просто, то читать обратно в нужной последовательности будет посложнее.
2
19 августа 2003 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by fellow
Запись в файл - тема большая. Именно для Вашего случая нужно писать в файл не саму AnsiString, а её содержимое, т.е. AnsiString::c_str(). Большое значение имеет также формат файла, т.к. если пихать туда int и строки вперемешку довольно просто, то читать обратно в нужной последовательности будет посложнее.


Благодарен за совет, однако! если использовать AnsiString::c_str(), то этот вариант испробован. вроде получается. но читает по прежнему с проблемами

310
19 августа 2003 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by squirL

Благодарен за совет, однако! если использовать AnsiString::c_str(), то этот вариант испробован. вроде получается. но читает по прежнему с проблемами


Именно это я и имел в виду, говоря о необходимости тщательно продумывать формат файла. Например, запись Ваших структур можно производить в текстовый файл построчно:
"3245"
"Строка текста из первой переменной"
"4352"
"Строка текста из второй половины".
При этом нужно пользоваться не WriteFile, которая очень мощная, но слишком низкоуровневая, а средствами форматированного ввода-вывода (потоками) стандартной библиотеки. Для файлов это будут классы ifstream для ввода и ofstream для вывода. У этих классов есть всё необходимое для поддержки вывода и ввода сложных структур данных.

2
21 августа 2003 года
squirL
5.6K / / 13.08.2003
Спасибо за Ваш совет, и участие в моей проблеме.
помоги чайнику и он перестанет быть чайником :)
Еще раз спасибо...
1
22 августа 2003 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by squirL
Спасибо за Ваш совет, и участие в моей проблеме.
помоги чайнику и он перестанет быть чайником :)
Еще раз спасибо...


Если надо читать и писать в файл можно использовать примерно вот такое:
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);

//Выполнение необходимой обработки объекта
}
Пишется и считывается без всяких проблем. Дополнительные переменные можно убрать и код значительно упростить...Можно изменять состояние потока. Этот вариант особенно удобен когда надо записывать или считывать в несколько файлов или несколько различных объектов.
Я пытался перегружать оператор << и >> - но это решение оказалось немного проще и эффективней. Для двоичных файлов по крайней мере.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог