Работа с текстовыми файлами в 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);
}

В начало

На главную подраздела

Домой