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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача на файлы 
:(
    Опции темы
katioxxa
Дата 24.11.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Помогите, пожалуйста, в написании программы
Скопировать содержимое текстового файла, удалив в каждой строке слово номер N+1, если в слове номер N есть символ 4. 

У меня пока получилось только: Скопировать содержимое текстового файла, удалив в каждой строке слово номер N

Код
#include <stdio.h>
#include <stdlib.h>

void del_n(char *pathFileInput, char *pathFileOutput, unsigned int *N)
{
    char c;
    unsigned int i=1;

    FILE *fileInput;
    FILE *fileOutput;
    fileInput =fopen(pathFileInput,  "r");
    fileOutput=fopen(pathFileOutput, "w");

    while((c=fgetc(fileInput))!=EOF)
    {

        while(c!='\n' && c!=EOF)
        {
            if (c==' ')
            {
                i++;
                fputc(' ', fileOutput);
            }
            else
              {

                if  (i!= *N)
                fputc(c, fileOutput);

              }
            c=fgetc(fileInput);


        }
        i=1;
        fputc('\n', fileOutput);
    }
    fclose(fileInput);
    fclose(fileOutput);
}

void main(void)
{
    char *strInput;
    char *strOutput;
    unsigned int *number;

    strInput=(char*)calloc(20, sizeof(char));
    strOutput=(char*)calloc(20, sizeof(char));
    number=(unsigned int*)malloc(1*sizeof(unsigned int));

    printf("Input file path:  ");
    scanf("%s", strInput);
                     printf("Output file path:  ");
    scanf("%s", strOutput);
                     printf("Number:  ");
    scanf("%u", n);
    printf("\n");

    del_n(strInput, strOutput, number);

    free(strInput);
    free(strOutput);
    free(number);
} 




Это сообщение отредактировал(а) katioxxa - 24.11.2008, 22:25
PM MAIL   Вверх
Rififi
Дата 25.11.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



katioxxa, 

Сильно не проверял, но вроде работает... (:

Код
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#include <stdexcept>

/*
    Скопировать содержимое текстового файла, удалив в каждой строке слово номер N+1,
    если в слове номер N есть символ 4. 
*/

template <typename _Action1>
void copy_file(const std::string& inFile, const std::string& outFile, _Action1 action)
{
    typedef std::vector<std::string> V;

    std::ifstream ifs(inFile.c_str());
    if (!ifs.good())
        throw std::invalid_argument("Input file error");

    V v;
    while (!ifs.eof())
    {
        std::string s;
        std::getline(ifs, s);
        
        if (s.size())
        {
            s = action(s);
            v.push_back(s);
        }
    }

    std::ofstream ofs(outFile.c_str());
    if (!ofs.good())
        throw std::invalid_argument("Output file error");
    std::copy(v.begin(), v.end(), std::ostream_iterator<V::value_type>(ofs, "\n"));
}

template <size_t N>
struct remove_next_word_if_prevoius_contains : std::unary_function<std::string, std::string>
{
    remove_next_word_if_prevoius_contains(typename argument_type::value_type ch) : ch_(ch) {}

    result_type operator () (const argument_type& s) const
    {
        std::string res = s;
        const std::binder1st<std::equal_to<typename argument_type::value_type> > spacer =
            std::bind1st(std::equal_to<argument_type::value_type>(), ' ');
        typename argument_type::iterator begin = res.begin(), end;
        
        // Найти слово с номером N
        size_t word_counter = N;
        while (true)
        {
            // найти начало слова
            if ((begin = std::find_if(
                    begin,
                    res.end(),
                    std::not1(spacer))) == res.end())
                    break;

            // найти конец слова
            end = std::find_if(begin + 1, res.end(), spacer);
            word_counter--;
            if (!word_counter || end == res.end())
                break;
            begin = end + 1;
        }

        // Проверяем выполнение условия и доступность слова N+1
        if (word_counter || end == res.end() ||
            (std::find(begin, end, ch_) == end) ||
            (begin = std::find_if(end+1, res.end(), std::not1(spacer))) == res.end())
            return (res);

        // Удаляем слово N+1
        res.erase(begin, std::find_if(begin + 1, res.end(), spacer));
        return (res);
    }

    const typename argument_type::value_type ch_;
};

int main()
{
    const std::string inFile = "in.txt";
    const std::string outFile = "out.txt";

    copy_file(inFile, outFile, remove_next_word_if_prevoius_contains<2>('4'));

    return (0);
}


Это сообщение отредактировал(а) Rififi - 25.11.2008, 00:09
PM MAIL   Вверх
bsa
Дата 25.11.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Rififi, у топикстартера вообще-то был Си...
PM   Вверх
destrd
Дата 25.11.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот я тоже начал на С++ начал, а потом увидел С и забилsmile
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
Rififi
Дата 25.11.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



bsa, 
мде, не обратил особого внимания
я когда вижу прототипы, подобные этому
void del_n(char *pathFileInput, char *pathFileOutput, unsigned int *N)
без const, дальше обычно уже не смотрю (:

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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