C++ Работа с файлами. Заменить слова файла, найденные в словаре слов, звездочками

    Задача:

  • Есть файл с текстом. Есть словарь слов. Все слова, которые есть в словаре слов, нужно найти в файле с текстом и каждое такое заменить на звёздочку.

Вот такая задача. Может она и покажется очень простой, но это не совсем так. Всё зависит от того, как мы видим проблему, и какое именно нам нужно решение. В большинстве случаев люди с форумов или студенты, сдающие лабораторные, выполнят решение, нарушив сам текст. Наиболее вероятно, что обрежут пробелы. Ну, или что-то в этом роде. Меня такой расклад не очень устраивает, поэтому я выбрал вариант решения с сохранением всех символов. Показываемое решение далеко от идеала и в нём есть, что можно поправить для небольшого ускорения работы. Тем не менее, этот код может оказаться полезен новичкам.

С++ Visual Studio 2015

Для лучшего понимания кода рекомендую сначала отвлечься от конечной цели и просто вывести на экран слова из файла, причём собирать слова посимвольно. Поскольку есть две цпочки: символы, в группе дающие слово, и символы — цепь разделителей, — то я использовал в коде дополнительную переменную, которая обозначает собирается ли слово или собранное слово сбрасывается (например, выводится на экран). После сброса собранного слова на анализ я обнуляю позиции: делаю слово пустым и ставлю курсор в начало слова. Это один из ключей моего подхода к решению пословного чтения без потери несловесных символов.
Когда слова собираются как нужно, нужно их искать в файле-словаре. Для поиска по словарю создана дополнительная функция. Именно результутат этой функции даёт нам понять, нужно ли подменять слово. Внутри функции главное правильно описать алгоритм поиска слова в словаре. Т. е. как только слово собрано, мы сбрасываем его в эту функцию, где слово проверяется по файлу-словарю. Нашли слово — сообщаем, что нашли и наоборот. Когда понятно, нашли мы слово или нет, нам понятно, нужно делать подмену или нет. Вот и всё.
Файл с текстом содержит любой текст с любым количеством строчек.
Файл-словарь хранит слова построчно или через пробелы.

Если у вас получилось, что в начале непонятно что вместо первого слова из файла, то значит, это невидимый символ. Вероятнее всего текстовый документ был сохранён в кодировке UTF-8 c каким-то там BOOM. Лучше вместо обычного блокнота использовать Notepad++. Можно просто пересоздать словарь. Создать новый документ, сохранить в кодировке ANSI и запихать в него словарь. В общем, как угодно убрать непечатаемый, скрытый с наших глаз символ.
Файлы, проверяемые во время создания:
input.txt

Test string file
	Mama mila ramu
	Polevoi lopata kupol epel
	oskolki  okean povest
	golova  serdce
	angel   svoboda krila   nebesa
	tesT test

dictionary.txt

test
	Test
	povest
	swoboda

	

В таком виде как есть, файлы должны находится в каталоге, где находится исполняемый файл. Проверку на успешное открытие имеет смысл добавить, я не добавил только чтобы не мешало смотреть на основную часть.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

2 комментария: C++ Работа с файлами. Заменить слова файла, найденные в словаре слов, звездочками

  • Этрусск говорит:

    Не знаю почему, но не производится замена. Текст выводится в консоль в исходном виде.

    Компилю под VS2005. В чем может быть причина?




    0



    0

Добавить комментарий

Ваш e-mail не будет опубликован.

59 − = 52

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/robertu-ieruzalimski/programmirovanie-na-yazyke-lua/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Когда проходишь IQ тест в интернете... помни что самый главный критерий определения твоего IQ — это отправишь ты СМС или нет...

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок