Форум программистов, компьютерный форум CyberForum.ru

Определить манипулятор - C++

Восстановить пароль Регистрация
 
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2010, 04:22     Определить манипулятор #1
Что-то часто я тут начал писать... Но тем не менее...

Задание определить манипулятор, который игнорирует все запятые и точки до конца строки. Немножко вошел в шок. Как это сделать? Как я понимаю нужно самому написать манипулятор. Поискал по книге примеры. Нашел один.
C++
1
2
3
4
5
6
7
//Игнорирует все символы до конца строки
template <class charT, class traits>
inline std::basic_istream<charT,traits>&ignoreLine(std::basic_istream<charT,traits>&strm)
{
    strm.ignore(std::numeric_limits<int>::max, strm.widen('\n'));
    return strm;
}
Поменял под свои два символа.

C++
1
2
3
4
5
6
template <class charT, class traits>
inline std::basic_istream<charT,traits>&ignoreLine(std::basic_istream<charT,traits>&strm)
{
    strm.ignore(std::numeric_limits<int>::max, strm.widen(',','.'));
    return strm;
}
Компилятор не ругается, все наверное хорошо... Но как это чудо вызвать в мейне? Да еще хотелось бы, чтобы это чудо строка отформатированная таким образом еще и выводилась на экран... Как это возможно сделать? Да и вообще. Правильно ли тут написано?

Вопрос отпал. Вышло как-то так. Может кому пригодится. Работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cstring>
class ignore_delim
{
private:
    char String[255];
public:
    ignore_delim(){}
    ~ignore_delim(){}
    friend std::ostream& operator <<(std::ostream& os, ignore_delim& str);
};
std::ostream& operator <<(std::ostream& os, ignore_delim& Ob)
{
    char c=',';
    char d='.';
    for(int i=0; i<strlen(Ob.String); i++)
        if(Ob.String[i]==c)
            Ob.String[i]=' ';
    for(int i=0; i<strlen(Ob.String); i++)
        if(Ob.String[i]==d)
            Ob.String[i]=' ';
    return os;
}
int main()
{
    char str[255];
    std::cout<<"Enter string\n";
    std::cin.getline(str, 255);
    std::cout<<ignore_delim()<<str<<'\n';
    return 0;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2010, 13:24     Определить манипулятор #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Может я что-то не правильно понял, но по-моему вот так проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
 
class DelimRemover {
    std::string m_sDelim;
public:
    DelimRemover(const std::string & delim) : m_sDelim(delim) {}
    std::string & operator () (std::string & str) {
        size_t pos;
        while ( ( pos = str.find_first_of(m_sDelim) ) != std::string::npos )
            str.erase(pos, 1);
        return str;
    }
};
 
int main(){
    std::string str("abc, def, gh.1234!xyz.");
    DelimRemover dr(",.!");
    
    std::cout << "Before: " << str << std::endl;
    std::cout << "After: " << dr(str) << std::endl;
    
    return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2010, 14:54  [ТС]     Определить манипулятор #3
easybudda, Ну да возможно. Тот пример с перегрузкой оператора вывода в поток я взял из книги Методики программирования Шилдта. Правда там было про добавление начальных пропусков... Вообщем пришлось поднапрячься. Спасибо!
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
10.07.2010, 21:23     Определить манипулятор #4
easybudda, а как бы выглядел класс, если надо было бы удалить не делимитеры, а теги например
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.07.2010, 05:59     Определить манипулятор #5
Цитата Сообщение от Egeni Посмотреть сообщение
а как бы выглядел класс, если надо было бы удалить не делимитеры, а теги например
Да примерно так же. Только в строке искался бы не первый из удаляемых символов, а вся подстрока (тег, слово из трёх букв, ещё что-нибудь)...
Yandex
Объявления
11.07.2010, 05:59     Определить манипулятор
Ответ Создать тему
Опции темы

Текущее время: 02:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru