Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++]Работа с текстом , Из текстового файла нужно выбрать строки 
:(
    Опции темы
klest
Дата 25.7.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2011

Репутация: нет
Всего: нет



Есть файл 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" и т.д.

Подскажите пожалуйста как это реализовать на С++!!!

Это сообщение отредактировал(а) klest - 25.7.2011, 16:43

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  Logfile.txt 67,71 Kb
PM MAIL   Вверх
DeMoNN
Дата 26.7.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: 1
Всего: 2



Самый простой способ исключать одинаковые строки - использовать хеш-таблицу. Выдираешь строки, считаешь хеш, смотришь, есть ли он в хеш-таблице, если нет, то выводишь в файл и ставишь пометку в таблице.

Если же проблема именно в выдирании строк, то тут все просто - легко заметить, что эти подстроки встречаются в каждой строке и начинаются с 15-й кавычки, так что просто считываешь символы из файла по одному, отсчитаваешь 14 кавычек и начинаешь сохранять строку в переменной и попутно считать хеш. Как только встречаешь очередную кавычку - перестаешь, делаешь описанные выше действия с хеш-таблицей и переходишь к следующей строке. Делаешь так до конца файла.

Если не знаешь, как реализовывать хеш-таблицу:
заводишь достаточно большой булевый массив, берешь хеш от строки и берешь его по модулю длины массива, это и будет индексом текущей строки в этом массиве. Если пометка есть - строка встречалась, если нет - не встречалась. Можно взять несколько массивов разного размера (лучше, если это будут взаимно простые числа). Тут сам тогда сообразишь, как проверять наличие строки.

Обычный полиномиальный хеш тут вполне подойдет.
PM MAIL ICQ   Вверх
klest
Дата 27.7.2011, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2011

Репутация: нет
Всего: нет



Спасибо! Попытаюсь теперь все это реализовать)))
PM MAIL   Вверх
Silent
Дата 27.7.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 6
Всего: 9



а я всегда map для таких дел использовал, дешево и сердито:
Код

std::map<std::string, int> a;
std::string word;

while (std::getline(std::cin, word))    
   a[word]++;

for (std::map<std::string, int>::iterator it = a.begin(); it != a.end(); it++)
   printf("%s", it->first);

PM MAIL   Вверх
klest
Дата 28.7.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2011

Репутация: нет
Всего: нет



В связи с отсутствием опыта программирования, не получается написать код. Кто-нибудь может написать хотя-бы половину кода с пояснением чтобы можно было дальше разобраться?        
PM MAIL   Вверх
DeMoNN
Дата 28.7.2011, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: 1
Всего: 2



Код немножко говнистый, но рабочий:
Код

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

ifstream fin("logfile.txt"); //твой файл
ofstream fout("result.txt"); //результат работы программы
string s; //сохраняем текущую подстроку сюда
string line; //текущая строка
char c; //текущий считываемый символ
int qn; //число кавычек
int ht[8][23]; //hash-таблица
int htn[8] = {2,3,5,7,11,13,17,23}; //для hash-таблицы
int i;
unsigned int hash, p; //хеш

int main()
{
    while (getline(fin, line)) { //пока не дойдем до конца файла
        qn = 0;
        i = 0;
        s = "";
        hash = 0;
        while (qn < 15) { //отсчитываем 14 кавычек
            c = line[i++]; //считываем очередной символ
            qn += (c == '"'); //если с - кавычка, то увеличиваем qn
        }
        c = line[i++];
        p = 3; //любое число, большее единицы
        while (c != '"') {
            s += c; //добавляем символ в строку
            hash += p*c; //считаем хеш
            p *= p;
            c = line[i++]; //считываем очередной символ
        }
        bool good = false;
        for (int j = 0; j < 8; j++) //проверяем наличие строки в хеш-таблице
            if (ht[j][hash%htn[j]] == 0) {
                good = true;
                break;
            }

        if (good) { //если строки нет в hash-таблице
            for (int j = 0; j < 8; j++) //добавляем ее
                ht[j][hash%htn[j]] = 1;
            fout << '"' << s << '"' << endl; //выводим строку
        }
    }

    fout.close();

    return 0;
}

PM MAIL ICQ   Вверх
klest
Дата 29.7.2011, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 27.4.2011

Репутация: нет
Всего: нет



Спасибо огромное!!! Программа работает, только при запуске появляется вот эта ошибка. Ни знаешь, что это за ошибка? 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ______.jpg 47,99 Kb
PM MAIL   Вверх
Silent
Дата 29.7.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 6
Всего: 9



klest, не слушай DeMoNN'а, это самый натуральный г..нокод - через полгода, глянув на него, понять логику кода невозможно. Я бы сделал так:
Код

#include <fstream>
#include <string>
#include <map>
#include <sstream>
using namespace std;

map <string, bool> paths;
string line, item;

int main()
{
    ifstream fin  ("logfile.txt");
    ofstream fout ("output.txt");
    while (getline(fin, line))
    {
        stringstream ss(line);
        for (int i = 0; i < 6; i++) 
            getline(ss, item, ',');
        paths[item] = true;
//        paths[_strupr(&item[0])] = true;
    }

    for (map<string, bool>::iterator it = paths.begin(); it != paths.end(); it++)
        fout << it->first << endl;
    return 0;
}

проще, надежнее, читабельнее. В лог-файле есть несколько одинаковых путей, написанных с разными регистрами, что с ними делать - решать тебе, для них я оставил закомментированную строчку, если регистр неважен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.