| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [С++]Работа с текстом |
| Автор: klest 25.7.2011, 16:36 |
| Есть файл logfile.txt из него нужно выбрать ("C:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\C++21.Week1\C++21.Week1") такого типа подстроки находящиеся в кавычках при этом удалить одинаковые и записать их в отдельный файл. Т.е. должно получиться: "C:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\C++21.Week1\C++21.Week1" "C:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\C++21.Week1\C++21.Week1\C++21.Week1.vcproj" "C:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\C++21.Week1\C++21.Week1.sln" и т.д. Подскажите пожалуйста как это реализовать на С++!!! |
| Автор: DeMoNN 26.7.2011, 14:42 |
| Самый простой способ исключать одинаковые строки - использовать хеш-таблицу. Выдираешь строки, считаешь хеш, смотришь, есть ли он в хеш-таблице, если нет, то выводишь в файл и ставишь пометку в таблице. Если же проблема именно в выдирании строк, то тут все просто - легко заметить, что эти подстроки встречаются в каждой строке и начинаются с 15-й кавычки, так что просто считываешь символы из файла по одному, отсчитаваешь 14 кавычек и начинаешь сохранять строку в переменной и попутно считать хеш. Как только встречаешь очередную кавычку - перестаешь, делаешь описанные выше действия с хеш-таблицей и переходишь к следующей строке. Делаешь так до конца файла. Если не знаешь, как реализовывать хеш-таблицу: заводишь достаточно большой булевый массив, берешь хеш от строки и берешь его по модулю длины массива, это и будет индексом текущей строки в этом массиве. Если пометка есть - строка встречалась, если нет - не встречалась. Можно взять несколько массивов разного размера (лучше, если это будут взаимно простые числа). Тут сам тогда сообразишь, как проверять наличие строки. Обычный полиномиальный хеш тут вполне подойдет. |
| Автор: klest 27.7.2011, 08:10 |
| Спасибо! Попытаюсь теперь все это реализовать))) |
| Автор: Silent 27.7.2011, 12:07 | ||
а я всегда map для таких дел использовал, дешево и сердито:
|
| Автор: klest 28.7.2011, 16:27 |
| В связи с отсутствием опыта программирования, не получается написать код. Кто-нибудь может написать хотя-бы половину кода с пояснением чтобы можно было дальше разобраться? |
| Автор: DeMoNN 28.7.2011, 20:39 | ||
Код немножко говнистый, но рабочий:
|
| Автор: klest 29.7.2011, 08:42 |
| Спасибо огромное!!! Программа работает, только при запуске появляется вот эта ошибка. Ни знаешь, что это за ошибка? |
| Автор: Silent 29.7.2011, 10:13 | ||
klest, не слушай DeMoNN'а, это самый натуральный г..нокод - через полгода, глянув на него, понять логику кода невозможно. Я бы сделал так:
проще, надежнее, читабельнее. В лог-файле есть несколько одинаковых путей, написанных с разными регистрами, что с ними делать - решать тебе, для них я оставил закомментированную строчку, если регистр неважен. |