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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
#1

Перегрузка операторов вывода для русификации строк - C++

19.02.2010, 17:44. Просмотров 2524. Ответов 38
Метки нет (Все метки)

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
#include <iostream>
#include <string>
#include <windows.h>
 
using namespace std;
 
friend ostream operator << (ostream &in, const char text[])
{
    char *s = new char[500];
    CharToOem(text,s);
    in << s;
    delete s;
    return in;
}
 
void print(const char text[])
{
    char *s = new char[500];
    CharToOem(text, s);
    printf("%s\n", s);
    delete s;
}
 
int main()
{
    print("Охохо ііі");    
    system("pause");
    return 0;
}
Проблема в том, что я хочу перегрузить оператор "<<" но не знаю как, т.к. использовать функцию print() не очень удобно, как оказалось..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2010, 17:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов вывода для русификации строк (C++):

Перегрузка операторов умножения и присваивания для строк. - C++
Помогите, пожалуйста, реализовать перегрузку операторов умножения и присваивания для такого задания со строками: &quot;Описать класс, 3...

Перегрузка операторов ввода\вывода - C++
Вот такой простенький пример описан во многих постах, есть в некоторых видео но у меня в компиляторе mvs 2015, при компиляции выдает...

Перегрузка операторов ввода и вывода - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class ComplexNumber { private: double a, b; ...

Перегрузка операторов ввода-вывода - C++
Доброго времени суток! Почему перестал работать &gt;&gt; оператор для стандартного типа char. Перегруженная операция cin&gt;&gt;one возвращает все...

Перегрузка операторов ввода и вывода - C++
Добрый вечер! Помогите с задачкой.Я создал класс очередь и класс массив очередей.задача готова, но препод потребовал перегрузить оператор...

Перегрузка операторов ввода вывода - C++
ребята болит уже голова)) main.cpp #include &quot;myStr.h&quot; int main() { myStr myS(&quot;ok&quot;); cout&lt;&lt;myS&lt;&lt;endl;//надо чтоб...

38
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,487
19.02.2010, 21:41 #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
class rus_ostream{
    ostream* out;
public:
    rus_ostream(){ out = &cout;};
    rus_ostream& operator <<(const char* text)
    {
        char* s = new char[500];
        CharToOemA(text, s);
        (*out) << s;
        delete s;
        return *this;
    }
} rcout;
 
int main(){
    rcout << "Привет мир!";
return 0;
}
Не знаю.... Вывело нормально Ничего не понимаю я короче в смысле жизни и все такое)
1
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 21:41  [ТС] #17
insideone, еще раз спасибо, а то я написал функцию и сам до сих пор полностью не понимаю какой обьем работы она может сделать))

ваш фрагмент заменил на:
C++
1
2
3
4
5
6
print(
            "Виберiть дiю:\n\n"
            "1 - запустити програму переведення чисел з однiєї системи числення в iншу;\n\n"
            "2 - запустити програму переведення суми, рiзницi та добутку в прямий, обернений та доповняльний коди;\n\n"
            "3 - вийти.\n"
        );
спасибо за подсказку, еще что-то видите?
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,487
19.02.2010, 21:47 #18
Цитата Сообщение от outoftime Посмотреть сообщение
спасибо за подсказку, еще что-то видите?
исчерпала себя))
1
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 22:25  [ТС] #19
insideone, меня осенило!!! с вашей помощью, я понял как создать клас, который будет полным заменителем cout, мне просто надо переписать тоже для всех типов в заголовочном файле..

Добавлено через 20 минут
insideone, еще один вопрос:
как перегрузить std::endl для нового класа??

Добавлено через 10 минут
и как перевести один символ а не всю строку

Добавлено через 18 секунд
имеется в виду в кирилицу
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,487
19.02.2010, 22:30 #20
Цитата Сообщение от outoftime Посмотреть сообщение
insideone, еще один вопрос:
как перегрузить std::endl для нового класа??
C++
1
2
3
4
    rus_ostream& operator <<(rus_ostream& x){
        (*out) << std::endl;
    return *this;
    }
C++
1
rcout << "Привет мир!" << rcout << "Пока мир!";
Может не шибко красиво и может даже не правильно, но по крайне мере удобно.


Цитата Сообщение от outoftime Посмотреть сообщение
и как перевести один символ а не всю строку
Ну а это не тоже самое что переводить строку в котором 1 символ... или как?
1
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 22:50  [ТС] #21
C++
1
2
3
4
rus_ostream& operator <<(rus_ostream& x){
                (*out) << std::endl;
        return *this;
        }
вот здесь - не понял

Добавлено через 57 секунд
Цитата Сообщение от insideone Посмотреть сообщение
Ну а это не тоже самое что переводить строку в котором 1 символ... или как?
так или не так, просто надо что-бы оператор получал симол 'x' а не строку "х".

Добавлено через 9 минут
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
32
33
namespace My
{
    class EndLine{}endl;
}
 
class rus_ostream
{
    std::ostream *out;
public:
    rus_ostream() { out = &(std::cout); }
    rus_ostream &operator << (const char s[])
    {
        char *text = new char[strlen(s)+5];
        CharToOem(s, text);
        (*out) << text;
        delete text;
        return *this;
    }
    rus_ostream &operator << (const std::string s)
    {
        char *text = new char[s.size()+5];
        CharToOem(s.c_str(), text);
        (*out) << text;
        delete text;
        return *this;
    }
    
    rus_ostream &operator << (My::EndLine &endl) { (*out) << std::endl; return *this; }    
    rus_ostream &operator << (int n) { (*out) << n; return *this; }
    rus_ostream &operator << (long long n) { (*out) << n; return *this; }
    rus_ostream &operator << (float n) { (*out) << n; return *this; }
    rus_ostream &operator << (double n) { (*out) << n; return *this; }
}print;
при использовании даного класа возникает маленькая неудобность в том, что для ввода я использую cin с пространства имен std а нужный мне endl в пространстве имен My, не знаете какой клас у стандартного endl ??
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 22:50 #22
C++
1
2
3
4
5
6
7
8
ostream & operator << (ostream &in, const char text[])
{
    char *s = new char[strlen(text)+1];
    CharToOem(text,s);
    in.write(s,strlen(s));
        delete s;
    return in;
}
компилится на VS 2008, g++ 4.12

Разница между постом №2 в том, что не возникает неоднозначности, когда в теле
C++
1
ostream & operator << (ostream &in, const char text[])
используется он сам же, что может привести к бесконечной рекурсии
1
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 22:53  [ТС] #23
и еще, не подскажите у класов есть что-то типа "прототипов" как у функций??
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,487
19.02.2010, 22:53 #24
Цитата Сообщение от outoftime Посмотреть сообщение
вот здесь - не понял
ну это метод класса

Цитата Сообщение от outoftime Посмотреть сообщение
так или не так, просто надо что-бы оператор получал симол 'x' а не строку "х".
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
32
33
34
35
36
37
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
class rus_ostream{
    ostream* out;
public:
    rus_ostream(){ out = &cout;};
    rus_ostream& operator <<(const char* text)
    {
        char* s = new char[500];
        CharToOemA(text, s);
        (*out) << s;
        delete s;
        return *this;
    }
    rus_ostream& operator <<(const char text)
    {
        char* s = new char[500];
        char ttext[2] = {text, 0};
        CharToOemA(&ttext[0], s);
        (*out) << s;
        delete s;
        return *this;
    }
    rus_ostream& operator <<(rus_ostream& x){
        (*out) << std::endl;
    return *this;
    }
} rcout;
 
 
int main(){
    rcout << "Привет мир!" << rcout << "Пока мир!" << '1';
return 0;
}
1
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
19.02.2010, 22:55 #25
outoftime, для чего эти танцы с бубном, если можно просто сменить текущую кодовую страницу консоли и спокойно выводить кириллицу?
0
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 22:59  [ТС] #26
Lolcht0, можете дать сылку на описание метода write

Добавлено через 25 секунд
CyBOSSeR, это мне уже говорили
0
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
19.02.2010, 23:00 #27
outoftime, может и говорили, но просто интересно, для чего тебе это?
0
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 23:03  [ТС] #28
Lolcht0, работает, спасибо
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:04 #29
outoftime, метод класса basic_ostream
1
outoftime
║XLR8║
723 / 623 / 78
Регистрация: 25.07.2009
Сообщений: 3,128
Записей в блоге: 5
19.02.2010, 23:11  [ТС] #30
CyBOSSeR, во первых: мне жутко интересно с этим "поиграться", во вторых: на меня преподы криво сотрят, когда я им проги с английским текстом приношу в трерьих: курсовой охота сделать русифицированым, в четвертых: заместителя декана нужна прога для проверки курсовых (на правельность расчетов), ее я тоже хочу сделать на русском

Добавлено через 3 минуты
и так, логическое завершение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ostream &operator << (ostream &cout, const char text[])
{
    char *s = new char [strlen(text)];
    CharToOem(text, s);
    cout.write(s,strlen(s));
    return cout;
}
ostream &operator << (ostream &cout, const char text)
{
    const char s[] = {text,'\0'};
    char *ds = new char [strlen(s)];
    CharToOem(s, ds);
    cout.write(ds,strlen(ds));
    return cout;
}
Добавлено через 47 секунд
всем кто будет читать эту тему, вам нужен код приведенный выше

Добавлено через 13 секунд
тема закрыта
0
19.02.2010, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2010, 23:11
Привет! Вот еще темы с ответами:

Перегрузка операторов ввода/вывода. - C++
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде (функции in и out): #include &lt;iostream&gt; #include...

Перегрузка операторов ввода/вывода - C++
Вроде сделал, но не работает перегрузка оператора ввода. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; ...

Перегрузка операторов ввода вывода - C++
в .h файле сделал объявление inline ostream&amp; operator &lt;&lt;(ostream&amp;, const Proc&amp;); inline istream&amp; operator &gt;&gt;(istream&amp;, Proc&amp;); в...

Перегрузка операторов потокового ввода вывода - C++
Есть класс &quot;деканат&quot;, полем которого есть список студентов, объектов из класса &quot;Студент&quot;. Как переопределяя операторы &quot;&gt;&gt;&quot; &quot;&quot;&lt;&lt;&quot; вывести...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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