Работа с текстовыми файлами в Borland C++ BuilderРабота с файлами с использованием функций компонентМногим визуальные компоненты и некоторые классы имеют доступ к функциям: LoadFromFile("Имя файла"); SaveToFile("Имя файла"); Эти функции особенно удобны для работы с текстовыми фыйлами. Примеры загрузки и сохранения файлов: //Визуальный компонент TMemo: Memo1->Lines->Clear(); Memo1->Lines->LoadFromFile("a.txt"); ...... Memo1->Lines->SaveToFile("a.txt"); ...... //Класс TStringList: TStringList * ptStrintList; ptStrintList->Clear(); ptStrintList=new TStringList(); ptStrintList->LoadFromFile("a.txt"); ...... ptStrintList->SaveToFile("a.txt"); ...... ptStrintList->Free(); //Визуальный компонент TListBox1: ListBox1->Items->Clear(); ListBox1->Items->LoadFromFile("a.txt"); ...... ListBox1->Items->SaveToFile("a.txt"); //Визуальный компонент TListBox1: ComboBox1->Items->Clear(); ComboBox1->Items->LoadFromFile("a.txt"); ...... ComboBox1->Items->SaveToFile("a.txt"); //Визуальный компонент TRichEdit: RichEdit1->Lines->Clear(); RichEdit1->Lines->LoadFromFile("a.txt"); ..... RichEdit1->Lines->SaveToFile("a.txt"); И.т.д. При использовании функции SaveToFile если файл не существует, то он будет создан. Во всех приведенных выше примерах создаются текстовые файлы. Компонент TRichEdit создает текстовый файл в формате .rtf, поэтому логичнее записать: RichEdit1->Lines->SaveToFile("a.rtf"); Работа с текстовыми файлами с использованием методов перечисленных классов и компонент аналогична. Все они имеют счетчик строк: Memo1->Lines->Count; RichEdit1->Lines->Count; ptStrintList->Count; ListBox1->Items->Count; ComboBox1->Items->Count; Все компоненты позволяют удалять, вставлять и добавлять строки (пример удаления второй строки вставки на ее место новой строки и добовления в конец списка новой строки): AnsiString vasS="Yes"; if(Memo1->Lines->Count >= 2) { Memo1->Lines->Delete(1); Memo1->Lines->Insert(1,vasS); } Memo1->Lines->Add(vasS); if(RichEdit1->Lines->Count >= 2) { RichEdit1->Lines->Delete(1); RichEdit1->Lines->Insert(1,vasS); } RichEdit1->Lines->Add(vasS); if(ptStrintList->Count >= 2) { ptStrintList->Delete(1); ptStrintList->Insert(1,vasS); } ptStrintList->Add(vasS); if(ListBox1->Items->Count >= 2) { ListBox1->Items->Delete(1); ListBox1->Items->Insert(1,vasS); } ListBox1->Items->Add(vasS); if(ComboBox1->Items->Count >= 2) { ComboBox1->Items->Delete(1); ComboBox1->Items->Insert(1,vasS); } ComboBox1->Items->Add(vasS); Содержимое строк можно получит по номеру строки n: AnsiString vasS; vasS=Memo1->Lines->Strings[n]; vasS=RichEdit1->Lines->Strings[n]; vasS=ptStrintList->Strings[n]; vasS=ListBox1->Items->Strings[n]; vasS=ComboBox1->Items->Strings[n]; Возможно присвоить некоторой строке текст для дальнейшей манипуляции содержимым текста как единой строкой и далее перенести исправленный текст опять в компоненты: AnsiString vasS; vasS=Memo1->Lines->GetText(); ... манипуляции с текстом как единой строкой Memo1->Lines->SetText(vasS.c_str()); RichEdit1->Lines->LoadFromFile("a.txt"); vasS=RichEdit1->Lines->GetText(); ... манипуляции с текстом как единой строкой RichEdit1->Lines->SetText(vasS.c_str()); vasS=ptStrintList->GetText(); ... манипуляции с текстом как единой строкой ptStrintList->SetText(vasS.c_str()); vasS=ListBox1->Items->GetText(); ... манипуляции с текстом как единой строкой ListBox1->Items->SetText(vasS.c_str()); vasS=ComboBox1->Items->GetText(); ... манипуляции с текстом как единой строкой ComboBox1->Items->SetText(vasS.c_str()); Кроме того компоненты TComboBox и TListBox позволяют (лучше в обработчике своих событий OnChange) получить доступ к выбранным строкам: void __fastcall TForm1::ComboBox1Change(TObject *Sender) { AnsiString vasS=ComboBox1->Items->Strings[ComboBox1->ItemIndex]; } void __fastcall TForm1::ListBox1Click(TObject *Sender) { AnsiString vasS=ListBox1->Items->Strings[ListBox1->ItemIndex]; } Компоненты TComboBox и TListBox кроме того позволяют определить номер строки по тексту в строке: int n; n=ComboBox1->Items->IndexOf("Yes"); n=ListBox1->Items->IndexOf("Yes"); Компоненты TComboBox и TListBox, класс TStringList кроме того позволяют выполнить сортировку загруженных строк: ptStrintList->Sort(); ListBox1->Sorted=true; ComboBox1->Sorted=true; Перечисленные методы практически полностью перекрывают все потребности для работы с текстовыми файлами. Как правило в большинстве случаев достаточными являются TMemo TrichEdit и класс TStringList. Однако многими возможностями при работе с текстом обладает класс TFileStream. Работа с файлами с использованием класса TFileStreamСледующий пример работы с текстовым файлом с использованием класса TFileStream может показаться некоторым программным извращением (класс более подходит для работы с бинарными файлами), но посколько при работе с текстовыми ресурсами наиболее удобными являются потоки, то рассмотрим и эту возможность. Ниже приведенный пример демонстрирует эту возможность: void __fastcall TForm1::Button1Click(TObject *Sender) { //Создаем поток и загружаем в него содержимое файла TFileStream * tfile=new TFileStream("b.txt",fmOpenReadWrite); //При открытии указатель и так на нуле и следующая строка лишняя tfile->Seek(0,0); //Буфер для информации char *vchrgBuf; //Выделяем память для него if ((vchrgBuf = (char *) malloc(tfile->Size)) == NULL) { //Здесь можно поместить сообщение об ошибке выделения памяти return; } //Читаем информацию в буфер tfile->Read(vchrgBuf,tfile->Size); //Копируем информацию в AnsiString AnsiString vasS=vchrgBuf; //На всякий случай vasS.SetLength(tfile->Size); //Освобождаем память free(vchrgBuf); //Очищаем поток tfile->Size=0; //Заносим данные в компонент TMemo для того //чтобы посмотреть, что там есть //Memo1->Lines->Clear(); Memo1->Lines->Add(vasS); //Изменим содержимое данных if(Memo1->Lines->Count >= 2) { Memo1->Lines->Delete(1); String vasS1="WWWW"; Memo1->Lines->Insert(1,vasS1); } //Забираем содержимое TMemo в AnsiString vasS=Memo1->Lines->GetText(); //Выделяем память для буфера if ((vchrgBuf = (char *) malloc(vasS.Length())) == NULL) { //Здесь можно поместить сообщение об ошибке выделения памяти return; } //Переносим измененный текст в буфер vchrgBuf=vasS.c_str(); tfile->Write(vchrgBuf,vasS.Length()); //Освобождают поток и переносим в память tfile->Free(); //Освобождаем память //free(vchrgBuf); } |