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

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

Войти
Регистрация
Восстановить пароль
 
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
#1

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

10.07.2010, 04:22. Просмотров 709. Ответов 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;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2010, 04:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить манипулятор (C++):

Манипулятор ws - C++
Собственно вопрос в следующем: может ли кто-то показать, как использовать манипулятор ws. Он, если я правильно понял, должен пробелы...

Собственный манипулятор - C++
Здорова господа! Я пытаюсь создать свой собственный манипулятор, который будет принимать основу числа: десять шестнадцать и два и само...

Символ '\n' и манипулятор endl - C++
Встретил в одной книге вот такое выражение (дословно): Если операционная система не использует буферизацию вывода, то между символом...

Манипулятор ввода / вывода - C++
Чем отличается манипулятор ввода\вывода от пользовательский ввод\вывод ?

Написать свой манипулятор - C++
Здравствуйте, подскажите пожалуйста, как для класса A, написать свой манипулятор, который вызвал бы функцию класса? Чтобы манипулятор мог...

Создайте манипулятор вывода - C++
Помогите срочно решить задачу Создайте манипулятор вывода sethex(), который осуществляет вывод в шестнадцатеричной системе счисления и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,700
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;
}
2
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
10.07.2010, 14:54  [ТС] #3
easybudda, Ну да возможно. Тот пример с перегрузкой оператора вывода в поток я взял из книги Методики программирования Шилдта. Правда там было про добавление начальных пропусков... Вообщем пришлось поднапрячься. Спасибо!
0
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
10.07.2010, 21:23 #4
easybudda, а как бы выглядел класс, если надо было бы удалить не делимитеры, а теги например
0
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,700
11.07.2010, 05:59 #5
Цитата Сообщение от Egeni Посмотреть сообщение
а как бы выглядел класс, если надо было бы удалить не делимитеры, а теги например
Да примерно так же. Только в строке искался бы не первый из удаляемых символов, а вся подстрока (тег, слово из трёх букв, ещё что-нибудь)...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2010, 05:59
Привет! Вот еще темы с ответами:

Не работает манипулятор setw(n) - C++
Здравствуйте, написал маленькую программку по разделу из книги, чтобы лучше понять как работает манипулятор setw(n), однако при компиляции...

Как создать манипулятор с параметрами? - C++
Манипулятор без параметров создать то просто //g++ 5.4.0 #include &lt;iostream&gt; std::ostream&amp; addok (std::ostream&amp; os) { ...

Что делает манипулятор flush? - C++
Доброго времени суток! Не могу толком разобраться, что делает манипулятор flush.Нужен простой пример в коде, как работает flush,...

Не работает самописный манипулятор вывода - C++
#include &lt;iostream&gt; #include &lt;bitset&gt; using namespace std; ostream&amp; bin(ostream&amp; stream, int&amp; num) { stream &lt;&lt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.07.2010, 05:59
Ответ Создать тему
Опции темы

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