Показать полную графическую версию : [решено] Поиск и замена текста
Здравствуйте.
Нужна помощь в поиске и замене текста в текстовом файле,желательно готовый пример.
Есть текстовый файл с именем "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++ написал так же,программа закричала что нет файл рядом с нашим исполняемым файлом.
И еще,не могли бы вы дописать проверку? Что бы программа смотрела,если есть.. загружаю.
Если нет,напишет что файл отсутствует.
За ранее благодарен.
В Delphi "C:\Log.txt" - в C++ написал так же,программа закричала что нет файл рядом с нашим исполняемым файлом. »
"C:\\log.txt". Символ \ является служебным в C++. Поэтому его нужно экранировать.
Спасибо.
С проверкой кто поможет или там можно использовать FileExists - ?
Или посоветуйте что почитать а то купил книжку себе а там чушь а не C++
Зря только 500р отдал за нее >_<
\\
Странно,почему не получается указать пусть до файла?
C:\\Program Files\Programma\test\Test.txt - Выдает ошибку + пусть до файла почему то слитно в ошибке пишет.
пусть до файла почему то слитно в ошибке пишет »
Как уже сказал ganselo, \ -является служебным символом, т.е. там где нужно его использовать необходимо прописывать его \\.
Ваш путь будет выглядить : C:\\Program Files\\Programma\\test\\Test.txt »
Синтаксическая ошибка в имени файла,имени папки или метки тома.. Вот такую ошибку получаю.
(Когда файл лежит рядом с программой все нормально,только косяк..
Если к примеру такой текст:
User: TEST
БЛА-БЛА: TEST
то последнюю строчку программа сносит.. >_<
И опять же,когда первый раз тестировал код нормально все было.
последнюю строчку программа сносит.. >_< »Так у вас же в задании сказано.
нужно найти и заменить текст который написан после слова "User" - Слово "User" в данном текстовом файле одно.» Я понял так что нужно заменить весь текст после слова User
С проверкой кто поможет или там можно использовать FileExists - ? »
...
if(FileExists("C:\\Log.txt")){
lst->LoadFromFile("Log.txt");
...
Давайте вы дадите текст который у вас есть в файле Log.txt и код который у вас есть, посмотрим.
Вопрос решен. Большое спасибо "Drongo" за помощь. Чуть позже выложу полный код,может кому он пригодится.
Может кто нибудь поможет переписать данный код что бы последнюю строчку программа не сносила?
{У меня кстати тоже ошибка в пути до файла.}
Указал путь до папки "C:\\Program Files\\Test.txt" а программа почему то ищет файл рядом с собой.
Может кто нибудь поможет переписать данный код что бы последнюю строчку программа не сносила? »Расширьте вашу задачу, опишите подробно, что есть и что хотите получить?
Есть текстовый файл,сколько там строк не известно. (Они могут меняется.)
Нужно заменить всего "5" строк.
Пример:
Test: 0
Test: 1
Test: 2
Test: 3
Test: 4
Test: 5
Нужно заменить текст который написан после "Test: "
Промеж данных строк могут быть и другие текстовые поля.
Для каждой из "5" строк есть свой Edit.
Edit1,Edit2... Нужно заменять текст на тот что написан в Edit.
{Вроде нормально описал что хочу.}
Почти тоже самое что просил автор темы.
Почти тоже самое что просил автор темы. »Да, можно немножко модифицировать код и приспособить под вашу задачу, я завтра-послезавтра сделаю.
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;
}
//---------------------------------------------------------------------------
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.