Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Роман_1985
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 34
1

Сравнение слов в одном файле со словами в другом файле

25.02.2015, 02:32. Просмотров 1138. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Суть задачи такая:
1. Первый файл - запросы с городами, второй файл - база городов РФ. Оба txt
2. Найти в запросах все города и сделать в дальнейшем какую-либо операцию, например, удаление найденных городов, замену или сделать первую букву заглавной.

вопрос знающим. Заключается в следующем. Какими способами это более менее нормально реализовать, в какую сторону копать?

Добавлено через 1 час 23 минуты
Пока надумал так:
1. Загрузка базы городов в map<int, string>
2. Чтение из файла с запросами пословно в str
3. Цикл - сравнивание str.compare(map[i])
Далее можно считать , например, в массив, индекс вхождения первой буквы каждого совпадения ( длину города и тд).
Какие есть еще предложения?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2015, 02:32
Ответы с готовыми решениями:

Поиск в текстовом файле всех слов, заданных в другом текстом файле
Вообщем такое задание: Поиск в текстовом файле всех слов, заданных в другом текстом файле; Не...

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

Работа со словами в текстовом файле
Есть текстовый файл наполненный словами, знаками препинания, двоеточиями ..etc. Нужно написать...

Наибольшее расстояние между словами в файле
Полный текст задачи: Дан файл, содержащий текст на русском языке и некоторые два слова. Определить,...

Поиск текста в файле между двумя данными словами
Привет всем. Подскажитье, как можно найти текст (неизвезный) между двух извесных слов в файле?...

13
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.02.2015, 03:31 2
Лучший ответ Сообщение было отмечено Роман_1985 как решение

Решение

Цитата Сообщение от Роман_1985 Посмотреть сообщение
Найти в запросах все города и сделать в дальнейшем какую-либо операцию
  • База городов конвертируется в автомат Ахо-Корасик.
  • Автомату скармливается файл запросов
  • На каждый найденный город вызывается обработчик, решающий, что с ним делать
1. Загрузка базы городов в map<int, string>
2. Чтение из файла с запросами пословно в str
3. Цикл - сравнивание str.compare(map[i])
Брось этих глупостей, Беня (с) Исаак Бабель
2
Renji
2193 / 1616 / 489
Регистрация: 05.06.2014
Сообщений: 4,682
25.02.2015, 04:36 3
Лучший ответ Сообщение было отмечено Роман_1985 как решение

Решение

Цитата Сообщение от Роман_1985 Посмотреть сообщение
1. Загрузка базы городов в map<int, string>
map<string,int>/set<string>
Цитата Сообщение от Роман_1985 Посмотреть сообщение
3. Цикл - сравнивание str.compare(map[i])
map.find(str)/set.count(str)
1
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.02.2015, 05:29 4
Цитата Сообщение от Renji Посмотреть сообщение
map
Не делайте так больше.

String searching algorithm
0
25.02.2015, 05:29
Renji
2193 / 1616 / 489
Регистрация: 05.06.2014
Сообщений: 4,682
25.02.2015, 15:59 5
Цитата Сообщение от gazlan Посмотреть сообщение
Не делайте так больше.
С чего бы? У меня - выделение слова из текста за линейное время и поиск в словаре за логарифм/константу (unordered_map). Ваш Ахо Корасик на каждый символ будет тратить тот же логарифм/константу, в зависимости от реализации перехода по ребрам. Те же яйца, профиль сбоку. Но мое решение целиком стандартное, а вам еще реализовать Ахо Корасика надо. А если сравнить сколько ваше и мое решение памяти жрет...
0
Роман_1985
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 34
25.02.2015, 16:13  [ТС] 6
Ахо-Корасик пока слишком сложно для меня, но спасибо за совет, получил доп. знания.
В общем, пока делаю с map. Основную задачу выполнил:
1. Нашел в запросах города
2. Заменил первую букву этих городов на Заглавную

НО, столкнулся со следующим вопросом.
А как записать обратно этот город в файл на тоже место? Или какое возможно другое решение?
Цель - чтобы получился файл с теми же запросами, но с городами с Заглавной буквы
0
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.02.2015, 16:23 7
Цитата Сообщение от Роман_1985 Посмотреть сообщение
файл с теми же запросами, но с городами с Заглавной буквы
Ну, так эту букву и меняйте. Ничего больше трогать не надо.
Memory-mapped file
Отображение файла в память
0
Renji
2193 / 1616 / 489
Регистрация: 05.06.2014
Сообщений: 4,682
25.02.2015, 16:34 8
Цитата Сообщение от Роман_1985 Посмотреть сообщение
А как записать обратно этот город в файл на тоже место? Или какое возможно другое решение?
Зависит от того, как вы этот файл читали.
Цитата Сообщение от gazlan Посмотреть сообщение
Memory-mapped file
И как это поможет если чтение слов велось из файлового потока? Поток то не говорит по какому смещению он слово прочитал (tellg не спасет, ибо не учтет лидирующие пробелы). А значит и неизвестно какое место отображенного в память файла менять.
0
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.02.2015, 16:40 9
Цитата Сообщение от Renji Посмотреть сообщение
И как это поможет

Не по теме:

Пройдите хоть раз по ссылкам, которые даются - и проникнитесь.

0
Renji
2193 / 1616 / 489
Регистрация: 05.06.2014
Сообщений: 4,682
25.02.2015, 16:44 10
Цитата Сообщение от gazlan Посмотреть сообщение
Пройдите хоть раз по ссылкам, которые даются - и проникнитесь.
Спасибо, с отображением файла в память я и так знаком. Еще раз:
C++
1
2
ifstream stream("text.txt");
stream>>word;
Ну отобразили теперь text.txt в память, какое его место менять чтобы исправить первую букву word?
PS "А ты через mapped file читай, тогда проблем не будет" не предлагать. Неудобно.
0
Роман_1985
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 34
25.02.2015, 16:44  [ТС] 11
Чтение у меня происходит из файлового потока...
Правильно ли я понял, что самое нормальное решение - отображение файла в память?
0
Renji
2193 / 1616 / 489
Регистрация: 05.06.2014
Сообщений: 4,682
25.02.2015, 16:58 12
Лучший ответ Сообщение было отмечено Роман_1985 как решение

Решение

Цитата Сообщение от Роман_1985 Посмотреть сообщение
Правильно ли я понял, что самое нормальное решение - отображение файла в память?
Самое геморройное, за отсутствием стандартных средств форматированного ввода. Да и стандартных средств отображения в память как такового (WinAPI не предлагать, ибо в стандарт не входит). Чуток подумав, вам нужно немного попрыгать с бубном вокруг tellg, setp и размера слова. Ну, как-то так:
C++
1
2
3
stream>>word;
stream.setp(stream.tellg()-word.size());
stream<<'A';
Добавлено через 6 минут
UPD Пардон, не setp, а seekp.
1
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.02.2015, 17:18 13
Цитата Сообщение от Роман_1985 Посмотреть сообщение
Правильно ли я понял, что самое нормальное решение - отображение файла в память?
Если требуется только in place редактирование, как в вашем случае (замена нескольких символов), то да, это оптимальный вариант - в связке с AC.

Не по теме:

К слову, AC - это стандартная техника, примеры кода несложно найти в сети, используется почти в любом сигнатурном сканере/антивирусе - рекомендую освоить.

1
Роман_1985
1 / 1 / 0
Регистрация: 05.12.2010
Сообщений: 34
25.02.2015, 17:41  [ТС] 14
Renji, Отлично, предложенный Вами способ работает!
gazlan, Так же спасибо за хорошие советы!
0
25.02.2015, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2015, 17:41

Использование массива объявленного в другом файле
есть 1.cpp в котором обьявлен массив char Array; и инициализирован данными 2.cpp нужно...

Функция уже определена в другом файле
Который день бьюсь и не могу найти ответа, подскажите, если знаете. Есть sparseMatrix.h: #pragma...

Определение перечисления (enum) в другом файле
Доброго времени суток! :) Вот мой вопрос: в классе A мне необходимо использовать перечисление B, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru