Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Работа с файлами


Автор: desert_rose 11.1.2007, 23:09

Не хватает решения этой задачки для зачета....

Даны два символьных файла F1 и F2. Файл F1 содержит произвольный текст. Слова в этом тексте разделены пробелами и знаками препинания. Файл F2 содержит не более 40 слов, которые разделены запятыми. Эти слова образуют пары: каждое первое слово считается заменяемым, каждое второе слово - заменяющим. Найти в файле F1 все заменяемые слова и заменить
их на соответствующие заменяющие. Результат поместить в файле G.

Сорри, забыла написать , что на С++( причем уже невпервые.....)

Автор: Xenon 12.1.2007, 16:00
Попытался как можно доходчивее прокомментировать код. Можно было и в класс объединить для удобства но, я так понимаю, для вашего примера - это лишние макароны smile Главное чтобы работало. Ну, по идее, исключений вам тоже особо не нужно, но все-таки, если криво введется путь к файлу, все-таки, лучше на это среагировать, поэтому я номинальную проверку добавил smile

Код

#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
#include <map>

using std::string;
using std::cout;
using std::cin;
using std::fstream;
using std::getline;


string parse(fstream* file_F1,fstream* file_F2)
{
    typedef std::map<string,string> DictArr; //Для удобства :)
    //Получение слов из файла F2
    DictArr dictionary;
    cout << "\nGetting words from F2 ... ";
    while (!file_F2->eof())
    {
        string src_word;
        string sub_word;
        getline(*file_F2,src_word,',');//Получаем заменяемое слово
        getline(*file_F2,sub_word,',');//Получаем заменитель
        dictionary[src_word]=sub_word;//Вносим заменяемое слово(ключ) и заменитель(значение) в ассоциативный массив(словарь)
    }
    cout << "Done\n";
    //Разбор строки
    string data;//Содержание файла после обработки
    string word;//Текущее слово
    //Считываем файл с текстом
    cout << "Parsing data from file F1 ";
    while (!file_F1->eof())
    {
        char separator;//Разделитель
        file_F1->get(separator);//Считываем символ
        //Проверяем "А знак ли это препинания?"
        if (separator==' ' || separator==',' || separator=='.' || separator==':' || separator=='!' || separator=='?' || separator=='!' || separator==';' || separator=='-')
        {
            DictArr::iterator iter=dictionary.find(word);//Если мы получили знак препинания, то слово считано и можно начать его поиск в словаре            
            if (iter==dictionary.end())//Если слово не нашли, то копируем как есть и прибавляем разделитель
            {
                data+=word+separator;
            }
            else
            {
                data+=dictionary[word]+separator;//Если нашли, тогда заменим слово ее значением из словаря и прибавим разделитель
            }
            word.clear();//Слово внесено в data, следовательно на данный момент слов в буффере нет - чистим переменную
        }
        //Если считанный символ не разделитель, значит это часть слова - помещаем символ в word
        else
        {
            word+=separator;
        }
    }
    cout << "Done\n";
    return data;//Возвращаем результат
}

int main(int argc, char* argv[])
{
    string path_F1;
    string path_F2;
    string path_G;
    string result;
    try
    {
        cout << "Enter path to F1 file: ";
        getline(cin,path_F1);
        fstream file_F1(path_F1.c_str(),std::ios::in);
        if (!file_F1)
        {
            throw ("Couldn`t open F1 file");
        }
        cout << "Enter path to F2 file: ";
        getline(cin,path_F2);
        fstream file_F2(path_F2.c_str(),std::ios::in);
        if (!file_F2)
        {
            throw ("Couldn`t open F1 file");
        }
        result=parse(&file_F1,&file_F2);
        cout << "Enter path to G file: ";
        getline(cin,path_G);
        fstream file_G(path_G.c_str(),std::ios::out);
        if (!file_G)
        {
            throw ("Couldn`t open G file");
        }
        file_G << result;
    }
    catch (char* msg)
    {
        cout << msg;
    }
    _getch();
    return 0;
}


PS. Надеюсь учел все необходимые знаки препинания smile Как бы жизнь была проще, если бы getfile мог бы принимать в аргументе несколько разделителей ...
PS2. Черт, уже точку забыл smile

Автор: desert_rose 12.1.2007, 23:59
...

Автор: kot_matros 13.1.2007, 00:25
что с тобой тебе дали уже ответ ниже на такой-же вопр

Автор: Rockie 13.1.2007, 00:49
desert_rose,  smile 

Зачем плодить http://forum.vingrad.ru/s/6d17f249812cffddf01e30c74ed0d000/topic-131547.html


Автор: Xenon 13.1.2007, 01:26
Учимся юзать copy-paste  smile 

Автор: Alexeis 13.1.2007, 14:08
Модератор: если вы потеряли свою тему, но не стоит создавать новую, зайдите в профиль и посмотрите справа в нижнем углу есть ссылки

Цитата

Полезные ссылки
Найти сообщения/темы участника


Если нажать на темы, то откроется список только с вашими темами, где вы легко найдете свою.

Добавлено @ 14:11 
Модератор: темы объединил 


Rockie, у каждого сообщения вверху справа есть кнопочка "report" она позволяет отослать сообщения всем модераторам раздела. Пользуйтесь  smile  .

Автор: desert_rose 13.1.2007, 18:47
сорри, не знаю, как так получилось, но спасибо за помощь))

Автор: Rockie 14.1.2007, 01:11
Alexeis,  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)