Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Поиск и замена текста (http://forum.oszone.net/showthread.php?t=191251)

Simpler 15-11-2010 10:38 1542984

Поиск и замена текста
 
Здравствуйте.

Нужна помощь в поиске и замене текста в текстовом файле,желательно готовый пример.
Есть текстовый файл с именем "Log.txt" нужно найти и заменить текст который написан после слова "User" - Слово "User" в данном текстовом файле одно.
Текст на который мы будем заменять нужно взять из edit,желательно бы не загружать текстовый файл в Memo или прочее компоненты.

У меня установлен "C++Builder 2010" C++ учить начал не так давно,если будите что то объяснять пишите по проще так как я в нем пока ноль.
За ранее вам благодарен.

Drongo 15-11-2010 15:40 1543198

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;
}
//---------------------------------------------------------------------------


Simpler 15-11-2010 22:57 1543536

Спасибо вам большое,у меня только один вопрос.. Как в C++ мне указать путь до файла?

В Delphi "C:\Log.txt" - в C++ написал так же,программа закричала что нет файл рядом с нашим исполняемым файлом.

И еще,не могли бы вы дописать проверку? Что бы программа смотрела,если есть.. загружаю.
Если нет,напишет что файл отсутствует.

За ранее благодарен.

ganselo 16-11-2010 07:52 1543665

Цитата:

Цитата Simpler
В Delphi "C:\Log.txt" - в C++ написал так же,программа закричала что нет файл рядом с нашим исполняемым файлом. »

"C:\\log.txt". Символ \ является служебным в C++. Поэтому его нужно экранировать.

Simpler 16-11-2010 08:05 1543668

Спасибо.

С проверкой кто поможет или там можно использовать FileExists - ?
Или посоветуйте что почитать а то купил книжку себе а там чушь а не C++
Зря только 500р отдал за нее >_<

\\
Странно,почему не получается указать пусть до файла?
C:\\Program Files\Programma\test\Test.txt - Выдает ошибку + пусть до файла почему то слитно в ошибке пишет.

LilLoco 16-11-2010 08:34 1543675

Цитата:

Цитата Simpler
пусть до файла почему то слитно в ошибке пишет »

Как уже сказал ganselo, \ -является служебным символом, т.е. там где нужно его использовать необходимо прописывать его \\.
Ваш путь будет выглядить :
Цитата:

C:\\Program Files\\Programma\\test\\Test.txt »

Simpler 16-11-2010 08:44 1543682

Синтаксическая ошибка в имени файла,имени папки или метки тома.. Вот такую ошибку получаю.
(Когда файл лежит рядом с программой все нормально,только косяк..

Если к примеру такой текст:
User: TEST
БЛА-БЛА: TEST

то последнюю строчку программа сносит.. >_<
И опять же,когда первый раз тестировал код нормально все было.

Drongo 17-11-2010 12:54 1544708

Цитата:

Цитата Simpler
последнюю строчку программа сносит.. >_< »

Так у вас же в задании сказано.
Цитата:

Цитата Simpler
нужно найти и заменить текст который написан после слова "User" - Слово "User" в данном текстовом файле одно.»

Я понял так что нужно заменить весь текст после слова User
Цитата:

Цитата Simpler
С проверкой кто поможет или там можно использовать FileExists - ? »

Код:

...
if(FileExists("C:\\Log.txt")){
      lst->LoadFromFile("Log.txt");
...

Давайте вы дадите текст который у вас есть в файле Log.txt и код который у вас есть, посмотрим.

Simpler 17-11-2010 16:41 1544962

Вопрос решен. Большое спасибо "Drongo" за помощь. Чуть позже выложу полный код,может кому он пригодится.

Merboot 29-11-2010 11:43 1553998

Может кто нибудь поможет переписать данный код что бы последнюю строчку программа не сносила?
{У меня кстати тоже ошибка в пути до файла.}
Указал путь до папки "C:\\Program Files\\Test.txt" а программа почему то ищет файл рядом с собой.

Drongo 29-11-2010 13:24 1554064

Цитата:

Цитата Merboot
Может кто нибудь поможет переписать данный код что бы последнюю строчку программа не сносила? »

Расширьте вашу задачу, опишите подробно, что есть и что хотите получить?

Merboot 29-11-2010 15:34 1554170

Есть текстовый файл,сколько там строк не известно. (Они могут меняется.)
Нужно заменить всего "5" строк.
Пример:

Test: 0
Test: 1
Test: 2
Test: 3
Test: 4
Test: 5

Нужно заменить текст который написан после "Test: "
Промеж данных строк могут быть и другие текстовые поля.
Для каждой из "5" строк есть свой Edit.
Edit1,Edit2... Нужно заменять текст на тот что написан в Edit.

{Вроде нормально описал что хочу.}

Почти тоже самое что просил автор темы.

Drongo 30-11-2010 00:55 1554692

Цитата:

Цитата Merboot
Почти тоже самое что просил автор темы. »

Да, можно немножко модифицировать код и приспособить под вашу задачу, я завтра-послезавтра сделаю.

Merboot 30-11-2010 08:41 1554810

Спасибо,буду ждать.

Drongo 30-11-2010 15:22 1555114

Merboot, А всё-таки, прикрепите файл, который нужно обработать, мне легче тестировать на живом примере чем на выдуманом. :)

Drongo 01-12-2010 16:03 1555920

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.

Время: 00:03.
© OSzone.net 2001-