| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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; //ну а теперь надо записать в его конец чего-нибудь - вот здесь проблема! TFileStream* File = new TFileStream(SetFile, fmOpenWrite); File->Write();//???? File->Free(); В общем |
| Автор: 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); спасибо! |
| Автор: 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 Вот с установочного хелп открыл, нашёл:
|
| Автор: NPLana 15.6.2005, 21:37 |
| спасибо! count!!! |