Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
#1

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

19.02.2010, 17:44. Просмотров 2573. Ответов 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++):

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

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

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

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

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

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

38
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 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 / 1
Регистрация: 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║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
19.02.2010, 22:53  [ТС] #23
и еще, не подскажите у класов есть что-то типа "прототипов" как у функций??
0
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,513
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
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
19.02.2010, 22:55 #25
outoftime, для чего эти танцы с бубном, если можно просто сменить текущую кодовую страницу консоли и спокойно выводить кириллицу?
0
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
19.02.2010, 22:59  [ТС] #26
Lolcht0, можете дать сылку на описание метода write

Добавлено через 25 секунд
CyBOSSeR, это мне уже говорили
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
19.02.2010, 23:00 #27
outoftime, может и говорили, но просто интересно, для чего тебе это?
0
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
19.02.2010, 23:03  [ТС] #28
Lolcht0, работает, спасибо
0
Lolcht0
123 / 121 / 1
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:04 #29
outoftime, метод класса basic_ostream
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 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
Lolcht0
123 / 121 / 1
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:19 #31
эй! я не такой код писал!
C++
1
 char *s = new char[strlen(text)+1];
+1 тут не случайно! strlen возвращает длину без терминирующего 0!
Each of these functions returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error.
а вот strcpy, скажем, копирует строку с терминирующем нулем!
The strcpy function copies strSource, including the terminating null character
CharToOem, скорее всего, действует так же, хотя это и не написано в документации
Поэтому если не писать +1, то произойдет переполнение буфера!

P.S. Для практических целей удобнее использовать setlocale
0
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
19.02.2010, 23:31  [ТС] #32
последний вопрос: где нужно проставить sdt:: в моем коде если пространство имен не подключено?

Добавлено через 1 минуту
Lolcht0, у меня либо руки крывые либо компилятор не тот, т.к. setlocale не пашет, что только не пробовал..
0
Lolcht0
123 / 121 / 1
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:32 #33
C++
1
std::ostream & operator << (std::ostream &in, const char text[])
Добавлено через 25 секунд
outoftime, компилятор, скорее всего, не у всех поддерживается
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
19.02.2010, 23:40  [ТС] #34
Lolcht0, спасибо я невнимательно код смотрел, было все верно, только один символ не потравил и уже пол часа как голову ломал ))

Добавлено через 2 минуты
Цитата Сообщение от Lolcht0 Посмотреть сообщение
+1 тут не случайно! strlen возвращает длину без терминирующего 0!
для in.write(s, len), len - это количество символов, или '\0' также считать надо?
0
Lolcht0
123 / 121 / 1
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:48 #35
нет, там не нужно, потому что
_Count - Count of characters to put into the stream.
(см. ссылку на описание ранее)
А вот при создании массива это критично! потому что CharToOem должен же сформировать null-терминированную строку на выходе, и если она не поместится в памяти, то это может привести к непредсказуемым последствиям)
1
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,513
19.02.2010, 23:51 #36
C++
1
char *s = new char [strlen(text)+1];
Кстати может статично выделить? А то что будет туда сюда выделяться удаляться?... ну это так... из ряда оптимизаций
1
Lolcht0
123 / 121 / 1
Регистрация: 30.03.2009
Сообщений: 766
20.02.2010, 00:03 #37
и как же это, статично?)
1
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,513
20.02.2010, 00:09 #38
Хм... нет, это я ошибся. Просто раньше там было char *s = new char[500]; Тогда можно было бы и статично
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
20.02.2010, 00:27  [ТС] #39
insideone, "Преждевременная оптимизация - корень всех зол." Кнут
Я ему верю, тем более что не раз уже на этом пападал))

Добавлено через 1 минуту
Цитата Сообщение от insideone Посмотреть сообщение
Просто раньше там было char *s = new char[500];
я тоже подумал что из ряда оптимизации 500 - это много, т.к. реально около 10-20, поэтому определять размер - лучше..

Добавлено через 15 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
std::ostream &operator << (std::ostream &cout, const char text[])
{
    char *s = new char [strlen(text)+1];
    CharToOem(text, s);
    cout.write(s,strlen(s));
    return cout;
}
 
std::ostream &operator << (std::ostream &cout, const char text)
{
    const char s[] = {text,'\0'};
    char *ds = new char [2];
    CharToOem(s, ds);
    cout.write(ds,strlen(ds));
    return cout;
}
подключил этот заголовочный файл и радуюсь жизни.
1
20.02.2010, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2010, 00:27
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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