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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
#1

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

10.07.2010, 04:22. Просмотров 696. Ответов 4
Метки нет (Все метки)

Что-то часто я тут начал писать... Но тем не менее...

Задание определить манипулятор, который игнорирует все запятые и точки до конца строки. Немножко вошел в шок. Как это сделать? Как я понимаю нужно самому написать манипулятор. Поискал по книге примеры. Нашел один.
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2010, 04:22     Определить манипулятор
Посмотрите здесь:

C++ Манипулятор ввода / вывода
C++ Создайте манипулятор вывода
Манипулятор ws C++
Как передать параметр в собственный манипулятор с параметром? C++
Символ '\n' и манипулятор endl C++
Собственный манипулятор C++
Написать свой манипулятор C++
C++ Не работает манипулятор setw(n)
C++ Показать на примере, как использовать манипулятор std::ws класса istream
Как использовать манипулятор flush в консольном приложении с++ C++
Манипулятор ввода, который поочередно то считывает, то пропускает каждые десять символов C++
Не работает самописный манипулятор вывода C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
11.07.2010, 05:59     Определить манипулятор #5
Цитата Сообщение от Egeni Посмотреть сообщение
а как бы выглядел класс, если надо было бы удалить не делимитеры, а теги например
Да примерно так же. Только в строке искался бы не первый из удаляемых символов, а вся подстрока (тег, слово из трёх букв, ещё что-нибудь)...
Yandex
Объявления
11.07.2010, 05:59     Определить манипулятор
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru