Главная » C++, C++ Builder » Пример программы замены строк STL

0

 

Теперь, когда мы просмотрели классы vector и string, можно рассмотреть пример, использующий их обоих, чтобы понять, как вы можете работать с классам vector и string.

Создайте консольное приложение (console application) в CBuilder.  Для  этого  выберите  команду меню File|New и выберите Console Application из первой страницы предложенных вариантов. CBuilder создаст новый файл проекта и основной файл программы, называемый project.cpp. Эта программа будет выполняться только из окна MS-DOS или в консольном режиме, в Windows 95 или NT, соответственно. Добавьте следующий код в исходный файл project.cpp:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <vector> using namaspace std;

class StringReplacement

{

private:

string strSearchText; string strReplcaeText;

public: StringReplacement(void)

{

}

StringReplacement (string search, string replace )

{

strSearchText = search; strReplaceText = replace;

}

void DoReplace (string &text)

{

int i = 0;

string strComplete = ""; while  (i < text.size() )

{

if   (!strncmp(text.c_str()+i, strSearchText/c_str(), strSearchText.size()) )

{

i += strSearchText.size(); strComplete += strReplaceText;

}

else

{

strComplete += text[i]; i++;

}

}

text = strComplete;

}

};

vector< StringReplacement,

allocator<StringReplacement> > strList;

int main(int argc, char **argv)

{

if  (argc < 2)

{

printf("Использование: repl <input-file>"\

"<definitions-file>\n");

return -1;

}

FILE *fp = fopen(argv[1], "r");

if  (fp == NULL )

{

printf("Не могу открыть файл %s\n", argv[1]); return -1;

}

strList.insert (strList.end(), StringRepacement("$$Автор$$", "Matt Telles") );

strList.insert (strList.end(), StringRepacement("$$Программа$$", "Matt’s Test") );

char szBuffer [256] ; while  (!feof(fp) )

{

if  (fgets(szBuffer, 255, fp) == NULL ) break;

string s = szBuffer;

for  (int i=0; i<strList.size(), ++i ) strList[i].DoReplace (s ); printf("%s", s.c_str());

}

fclose(fp); return 0;

}

В этой демонстрационной программе есть несколько важных моментов. Программа, кстати, будет искать и заменять все вхождения данного набора строк в файле другим набором строк. Здесь мы используем vector для хранения объектов, которые содержат строки. Вы можете видеть, как мы проходимся по массиву, используя методы класса vector size и operator[]. В дополнение, вы можете видеть, как vector может хранить разные данные, даже если они и не происходят от общего предка. Если вы знакомы с другими системами, где работа с разными данными требует, чтобы они наследовали от общего базового класса, то вы знаете, насколько это приятно.

Для запуска программы замены откройте окно MS-DOS и запустите программу project1.exe. Вам придется создать два файла, первый из них файл замен, содержащий элементы в виде

oldvalue=newvalue

где oldvalue — значение, которое вы хотите заменить, а newvalue — значение, которым вы хотите заменить старое. Например, для замены всех вхождений строки $$Author$$ на имя Matt Telles вы можете написать:

$$Author$$=Matt Telles

<$FНетрудно заметить,  что программа, приведенная в листинге, не читает данные  из  второго файла, заданного в параметрах командной строки. То есть замена происходит только явно указанных в программе строк. Код на компакт-диске полностью  идентичен  листингу.  Видимо, автор оставил доработку этой программы читателю в качестве упражнения. — Прим. пер.>Эта программа хороша как обработчик шаблона для документов и исходных файлов, которым нужен заголовок, и в других случаях. Код этой программы может быть вырезан и помещен во вспомогательную  функцию,  которую  вы  могли  бы  использовать  в  своих  приложениях  для

генерации стандартизованных заголовков в своих файлах, к примеру. Во втором файле  у  вас должен быть текст, например:

The author of this program:

$$Author$$ and it was written on $$Date$$

Тогда после запуска программы замены вывод будет выглядеть так: The author of this program:

Matt Telles and it was written on Today.

Вот и все, что можно сказать о векторах (vector). Как  почти все  в STL, они очень просты в использовании и работа с ними интуитивно понятна. Вспомните о векторах, когда будете писать какие-нибудь классы или компоненты в CBuilder, которым будет нужен массив неопределенного (или впоследствии изменяемого) размера.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии