Поиск и замена текста
Здравствуйте.
Нужна помощь в поиске и замене текста в текстовом файле,желательно готовый пример.
Есть текстовый файл с именем "Log.txt" нужно найти и заменить текст который написан после слова "User" - Слово "User" в данном текстовом файле одно.
Текст на который мы будем заменять нужно взять из edit,желательно бы не загружать текстовый файл в Memo или прочее компоненты.
У меня установлен "C++Builder 2010" C++ учить начал не так давно,если будите что то объяснять пишите по проще так как я в нем пока ноль.
За ранее вам благодарен.
|
Simpler, Я написал, но по-дилетантски. :) Понадобятся компоненты: Edit, Button. Программа грузит файл Log.txt в список TStringList, дальше примитивно обрабатывает и сохраняет результат в файл Test.txt
Код:
// Обрабатываем файл по нажатию кнопки---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *lst = new TStringList; // Список, куда мы грузим "Log.txt"
TStringList *lstReplace = new TStringList; // Временный список
String str = "User"; // Слово которое мы ищем
String tempStr; // Формируемая строка в которой найденое слово "User" + текст из Edit
lst->LoadFromFile(ExtractFilePath(Application->ExeName) + "Log.txt"); // Загружаем файл
for(int i = 0; i < lst->Count; i++){
if(lst->Strings[i].Pos(str)){
for(int j = 0; j < i; j++){
lstReplace->Add(lst->Strings[j]);
}
tempStr = lst->Strings[i].SubString(1, lst->Strings[i].Pos(str) + str.Length());
tempStr += " " + Edit1->Text;
lstReplace->Add(tempStr);
break;
}
}
lstReplace->SaveToFile(ExtractFilePath(Application->ExeName) + "Test.txt");
delete lst;
delete lstReplace;
}
//---------------------------------------------------------------------------
|
Спасибо вам большое,у меня только один вопрос.. Как в C++ мне указать путь до файла?
В Delphi "C:\Log.txt" - в C++ написал так же,программа закричала что нет файл рядом с нашим исполняемым файлом.
И еще,не могли бы вы дописать проверку? Что бы программа смотрела,если есть.. загружаю.
Если нет,напишет что файл отсутствует.
За ранее благодарен.
|
Цитата:
Цитата Simpler
В Delphi "C:\Log.txt" - в C++ написал так же,программа закричала что нет файл рядом с нашим исполняемым файлом. »
|
"C:\\log.txt". Символ \ является служебным в C++. Поэтому его нужно экранировать.
|
Спасибо.
С проверкой кто поможет или там можно использовать FileExists - ?
Или посоветуйте что почитать а то купил книжку себе а там чушь а не C++
Зря только 500р отдал за нее >_<
\\
Странно,почему не получается указать пусть до файла?
C:\\Program Files\Programma\test\Test.txt - Выдает ошибку + пусть до файла почему то слитно в ошибке пишет.
|
Цитата:
Цитата Simpler
пусть до файла почему то слитно в ошибке пишет »
|
Как уже сказал ganselo, \ -является служебным символом, т.е. там где нужно его использовать необходимо прописывать его \\.
Ваш путь будет выглядить :
Цитата:
C:\\Program Files\\Programma\\test\\Test.txt »
|
|
Синтаксическая ошибка в имени файла,имени папки или метки тома.. Вот такую ошибку получаю.
(Когда файл лежит рядом с программой все нормально,только косяк..
Если к примеру такой текст:
User: TEST
БЛА-БЛА: TEST
то последнюю строчку программа сносит.. >_<
И опять же,когда первый раз тестировал код нормально все было.
|
Цитата:
Цитата Simpler
последнюю строчку программа сносит.. >_< »
|
Так у вас же в задании сказано.
Цитата:
Цитата Simpler
нужно найти и заменить текст который написан после слова "User" - Слово "User" в данном текстовом файле одно. »
|
Я понял так что нужно заменить весь текст после слова User
Цитата:
Цитата Simpler
С проверкой кто поможет или там можно использовать FileExists - ? »
|
Код:
...
if(FileExists("C:\\Log.txt")){
lst->LoadFromFile("Log.txt");
...
Давайте вы дадите текст который у вас есть в файле Log.txt и код который у вас есть, посмотрим.
|
Вопрос решен. Большое спасибо "Drongo" за помощь. Чуть позже выложу полный код,может кому он пригодится.
|
Может кто нибудь поможет переписать данный код что бы последнюю строчку программа не сносила?
{У меня кстати тоже ошибка в пути до файла.}
Указал путь до папки "C:\\Program Files\\Test.txt" а программа почему то ищет файл рядом с собой.
|
Цитата:
Цитата Merboot
Может кто нибудь поможет переписать данный код что бы последнюю строчку программа не сносила? »
|
Расширьте вашу задачу, опишите подробно, что есть и что хотите получить?
|
Есть текстовый файл,сколько там строк не известно. (Они могут меняется.)
Нужно заменить всего "5" строк.
Пример:
Test: 0
Test: 1
Test: 2
Test: 3
Test: 4
Test: 5
Нужно заменить текст который написан после "Test: "
Промеж данных строк могут быть и другие текстовые поля.
Для каждой из "5" строк есть свой Edit.
Edit1,Edit2... Нужно заменять текст на тот что написан в Edit.
{Вроде нормально описал что хочу.}
Почти тоже самое что просил автор темы.
|
Цитата:
Цитата Merboot
Почти тоже самое что просил автор темы. »
|
Да, можно немножко модифицировать код и приспособить под вашу задачу, я завтра-послезавтра сделаю.
|
Merboot, А всё-таки, прикрепите файл, который нужно обработать, мне легче тестировать на живом примере чем на выдуманом. :)
|
Merboot, Тоже по-дилетантски. :) Но вроде бы работает. :yes:
Код:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int count = 0;
TStringList *lst = new TStringList();
TStringList *lstReplace = new TStringList();
lst->Text = Memo1->Text;
String str = "Test:"; // Слово которое мы ищем
String tempStr = ""; // Формируемая строка в которой найденое слово "Test:" + текст из Edit
// lst->LoadFromFile(ExtractFilePath(Application->ExeName) + "Log.txt"); // Загружаем файл
for(int i = 0; i < lst->Count; i++){
if(!lst->Strings[i].Pos(str)){
lstReplace->Add(lst->Strings[i]);
}
else if(lst->Strings[i].Pos(str)){
tempStr = "";
if(count == 1){
tempStr = lst->Strings[i].SubString(1, lst->Strings[i].Pos(str) + str.Length());
tempStr += Edit1->Text;
lstReplace->Add(tempStr);
}
else if(count == 2){
tempStr = lst->Strings[i].SubString(1, lst->Strings[i].Pos(str) + str.Length());
tempStr += Edit2->Text;
lstReplace->Add(tempStr);
}
else if(count == 3){
tempStr = lst->Strings[i].SubString(1, lst->Strings[i].Pos(str) + str.Length());
tempStr += Edit3->Text;
lstReplace->Add(tempStr);
}
else if(count == 4){
tempStr = lst->Strings[i].SubString(1, lst->Strings[i].Pos(str) + str.Length());
tempStr += Edit4->Text;
lstReplace->Add(tempStr);
}
else if(count == 5){
tempStr = lst->Strings[i].SubString(1, lst->Strings[i].Pos(str) + str.Length());
tempStr += Edit5->Text;
lstReplace->Add(tempStr);
}
count++;
}
}
lstReplace->SaveToFile(ExtractFilePath(Application->ExeName) + "Test.txt");
delete lst;
delete lstReplace;
}
//---------------------------------------------------------------------------
|
Время: 00:03.
© OSzone.net 2001-