Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5

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

19.02.2010, 17:44. Показов 4928. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2010, 17:44
Ответы с готовыми решениями:

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

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

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

38
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
19.02.2010, 22:50  [ТС]
Студворк — интернет-сервис помощи студентам
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
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 22:50
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
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
19.02.2010, 22:53  [ТС]
и еще, не подскажите у класов есть что-то типа "прототипов" как у функций??
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
19.02.2010, 22:53
Цитата Сообщение от 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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
19.02.2010, 22:55
outoftime, для чего эти танцы с бубном, если можно просто сменить текущую кодовую страницу консоли и спокойно выводить кириллицу?
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
19.02.2010, 22:59  [ТС]
Lolcht0, можете дать сылку на описание метода write

Добавлено через 25 секунд
CyBOSSeR, это мне уже говорили
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
19.02.2010, 23:00
outoftime, может и говорили, но просто интересно, для чего тебе это?
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
19.02.2010, 23:03  [ТС]
Lolcht0, работает, спасибо
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:04
outoftime, метод класса basic_ostream
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
19.02.2010, 23:11  [ТС]
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
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:19
эй! я не такой код писал!
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
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
19.02.2010, 23:31  [ТС]
последний вопрос: где нужно проставить sdt:: в моем коде если пространство имен не подключено?

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

Добавлено через 2 минуты
Цитата Сообщение от Lolcht0 Посмотреть сообщение
+1 тут не случайно! strlen возвращает длину без терминирующего 0!
для in.write(s, len), len - это количество символов, или '\0' также считать надо?
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
19.02.2010, 23:48
нет, там не нужно, потому что
_Count - Count of characters to put into the stream.
(см. ссылку на описание ранее)
А вот при создании массива это критично! потому что CharToOem должен же сформировать null-терминированную строку на выходе, и если она не поместится в памяти, то это может привести к непредсказуемым последствиям)
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
19.02.2010, 23:51
C++
1
char *s = new char [strlen(text)+1];
Кстати может статично выделить? А то что будет туда сюда выделяться удаляться?... ну это так... из ряда оптимизаций
1
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
20.02.2010, 00:03
и как же это, статично?)
1
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
20.02.2010, 00:09
Хм... нет, это я ошибся. Просто раньше там было char *s = new char[500]; Тогда можно было бы и статично
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
20.02.2010, 00:27  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2010, 00:27

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru