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