Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > помогите с записью в файл...


Автор: NPLana 14.6.2005, 22:32
Помогите - никогда этого не делала...
Требуется: создать файл, из него читать данные и дозаписывать, если чего-то там не найдем..
Делаю так:

//Сначала создаю файл тужа, где прога находится
AnsiString CurPath = ExtractFilePath(Application->ExeName); //определили где прога
AnsiString SetFile = CurPath+"\\set.ini";
if (!FileExists(SetFile)) //если нету
FileCreate(SetFile); //создали файл

//Далее хочу читать, что-то с прочитанным делать - ну с этим худо бедно могу справиться:
TStringList *List = new TStringList;
char sd[20];
List->LoadFromFile(SetFile);
sscanf(List->Strings[0].c_str(),"%s",sd);;
FLook->Label47->Caption=sd;//IntToStr(i1);
delete List;

//ну а теперь надо записать в его конец чего-нибудь - вот здесь проблема! smile
TFileStream* File = new TFileStream(SetFile, fmOpenWrite);
File->Write();//????
File->Free();

В общем smile

Автор: kline 15.6.2005, 12:22
Да просто делай:
List->Add("то что нужно");
List->SaveTofILE("имя файла");
Если указывать имя файла без полного пути то по умолчанию
он создастся именно в директории с программой.

Автор: vadims 15.6.2005, 13:08
Я что-то не понял
File->Write();
где указано чего именно нужно записать ???

прототип: int __fastcall Write(const void *Buffer, int Count);

нужно примерно так:

for( int i = 0; i < List->Count; i++)
File->Write( List->Strings[i].c_str(), strlen(List->Strings[i].c_str()) );

но даже если ты и сделаешь так - все равно ничего не получиться кроме Exeption'а , тк ты ведь список то уже удалил
delete List;

И еще, мне активно не нравиться конструкция
sscanf(List->Strings[0].c_str(),"%s",sd);

здесь могу ошибаться тк сам scanf'ами никогда не пользуюсь, но помоему ты пытаешь 'ручками' редатировать динамические строки.
Манипулировать элементами списка можно только с помощью его методов типа Add, Remove и тд



Автор: NPLana 15.6.2005, 19:02
ну собственно как раз и непонятно было, что писать во Write()
теперь ясно, но как при записи в файл осуществлять переход на след строку, а также если надо записать в строку несколько значений как их отделить пробелами?...
Добавлено @ 19:11
с проблема разобралась... но как перейти на след строку??

Автор: vadims 15.6.2005, 19:28
После каждой строки записывай возврат каретки+перевод строки, те
fwrite( "\r\n", 2, 1, File );

Автор: NPLana 15.6.2005, 19:36
Сработало вот такое: File->Write("\r\n",2); smile
спасибо!

Автор: vadims 15.6.2005, 19:41
Тьфу ты - забыл что за потоковые функции ты используешь :

File->Write( "\r\n", 2 );

Автор: NPLana 15.6.2005, 20:48
Возник новый вопрос...
При чтении из файла как проверить файл на конец файл?
так что-то не работает:

TStringList *List = new TStringList;
List->LoadFromFile(SetFile);
int j=0;
while (List->Strings[j]!=NULL) //?????
{
sscanf(List->Strings[j].c_str(),"%s%s%s",Nip705,NewNameIP,NewNumIP);

//здесь будет проверка считанных значений на совпадения с др данными
//кстати считанные значения редактироваться не будут
}
delete List;

Автор: Любитель 15.6.2005, 21:18
У стринглиста есть метод возвращающей количество элементов (size или count, плюс мможет Get, а может ещё Items). Как точно называется сейчас не скажу, т. к. не стоит не Билдер, не Делфи, не справочник VCL. Ну ты по списку там посмотри, найдёшь.
Добавлено @ 21:25
Вот с установочного хелп открыл, нашёл:
Цитата
Indicates the number of strings in the list.

property Count: Integer;

Description

Use Count when iterating over all the strings in the list, or when trying to locate the position of a string relative to the last string in the list.

Автор: NPLana 15.6.2005, 21:37
спасибо! count!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)