Каракули в консоле на С++ и как с этим бороться (Перегрузка оператора ввода\вывода)

Модератор: Модераторы разделов

Аватара пользователя
MPak
Сообщения: 24

Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

Второй год пишу на VС++ и мучаюсь с каракулями в консолях. Решение проблемы я нашел а точнее почти...
Нужно перегрызить оператор вывода вставив ф-цию: CharToOem()

Вот пример работы ф-ции:
#include<windows.h>
#include<iostream.h>
main()
{
char p[10];
CharToOem("Привет мир , Hello world ",p)
cout<<p<<endl;
}

Выводит:
Привет мир , Hello world

У меня возникла проблема: не могу запихать ф-цию в перегрузку оператора.
Приведите пример как это можно сделать.
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение elide »

а какое отношение перекодировка для вывода на виндовую консоль в ВизуалСтудии имеет к линуксфоруму?
слава роботам!
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

elide писал(а):
04.11.2005 22:58
а какое отношение перекодировка для вывода на виндовую консоль в ВизуалСтудии имеет к линуксфоруму?

И всетаки как?
...
Хочешь сказать, что на линуксе будет все по русски а не по ХЗ как??!!??
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение t.t »

Хочешь сказать, что на линуксе будет все по русски а не по ХЗ как??!!??
Именно. Это чисто виндовая проблема, заключающаяся в том, что консоль работает в досовской кодировке, а редактор ВС -- в виндовой; и это никак не лечится. Ну, т.е. можно сделать консоль виндовой, но тогда все остальные программы в ней будут косячить, а вот в редакторе поменять кодировку нельзя. И функция CharToOem, походу, тоже чисто ВС-ная.

Кстати..
char p[10];
CharToOem("Привет мир , Hello world ",p)
До mem allocation errorа ещё не доэкспериментировались? ;)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

Ну не дописал нолик в скобочках, но ведь суть вопроса не в этом была. Я хотел научиться перегружать оператор вывода применяя ф-цию к вводимой в cout'те строке...
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение t.t »

Ну не дописал нолик в скобочках, но ведь суть вопроса не в этом была.
Это я так, на всякий случай.

Я хотел научиться перегружать оператор вывода применяя ф-цию к вводимой в cout'те строке...
По ходу, форум и правда не тот выбрали для таких вопросов.. Ну ладно, я понимаю, что суть не меняется. А как вы собираетесь его перегружать, кстати? По-моему, варианта два: либо писать заново и туда встраивать CharToOem, либо вызывать существующую реализацию метода <<. Но как вы собираетесь её вызывать, если она будет перегружена?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

Ну допустим не через cout<<, а создав новую ф-цию вывода например pout<<...
Я пока не очень хорошо знаю язык чтобы эксперементировать с подобными вещами. Если можно приведите пример подобной ф-ции.
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение t.t »

Ну допустим не через cout<<, а создав новую ф-цию вывода например pout<<...
Я пока не очень хорошо знаю язык чтобы эксперементировать с подобными вещами. Если можно приведите пример подобной ф-ции.
Допустим, << -- это не функция, а оператор. Я не настолько хорошо помню С++ (точнее сказать, совсем его не помню), чтобы сказать слёту как создать потомок класса, перегрузив только этот оператор. Если нужна именно функция, могу набросать. Но у меня по ходу дела вопрос: как вы собираетесь научиться программированию, если такие элементарные вещи спрашиваете на форуме?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение Asgard »

Ну допустим не через cout<<, а создав новую ф-цию вывода например pout<<...
Я пока не очень хорошо знаю язык чтобы эксперементировать с подобными вещами. Если можно приведите пример подобной ф-ции.


оператор << можно перегрузить так:

Код: Выделить всё

std::ostream& operator<<(std::ostream& os, YourClass& obj)
{
/*...*/

return os;
}

где YourClass - твой класс, для которого ты хочешь перегрузить оператор,

P.S. а вообще в любой мало-мальски толковой книги по плюсам всё это напимано. Слепым тыканием ничего, имхо, не добьёшься.
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

Я в "общем" знаю как перегружать оператор но как в перегруженный оператор ф-цию вставить я не понял...
Хоть чемто помогите.
P.S. а вообще в любой мало-мальски толковой книги по плюсам всё это напимано. Слепым тыканием ничего, имхо, не добьёшься.

Прочел штук пять, а именно этого в них не нашел
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение Asgard »

как в перегруженный оператор ф-цию вставить

поясните
Прочел штук пять, а именно этого в них не нашел

Страуструпа читали?
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

как в перегруженный оператор ф-цию вставить

поясните

Поясняю: применить к вводимой в ковычках строке какую либо ф-цию

Прочел штук пять, а именно этого в них не нашел

Страуструпа читали?


Читал, и не только Страуструпа. Там описана перегрузка оператора<< но именно этого там я не нашел.
Если можешь приведи пример такой перегрузки.
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение Asgard »

применить к вводимой в ковычках строке какую либо ф-цию

по сути это значит перегрузку оператора "" =)
а поскольку кавычки не входят в список операторов, которые можно перегружать - сотворить такое невозможно.

а чем не устраивает перегрузка << или применение к строке явной функции?
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение oav »

Asgard писал(а):
07.11.2005 01:46
применить к вводимой в ковычках строке какую либо ф-цию

по сути это значит перегрузку оператора "" =)
а поскольку кавычки не входят в список операторов, которые можно перегружать - сотворить такое невозможно.

а чем не устраивает перегрузка << или применение к строке явной функции?

http://rsdn.ru/article/qna/ui/concp.xml?print
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение elide »

Код: Выделить всё

#include <iostream>
using namespace std;

typedef struct { char* string; } ConvertedString;

ConvertedString convert(const char *s, char* ss){
        strcpy(ss, s);
        ConvertedString b;
        b.string = ss;
        while(*ss)
                (*(ss++))++;
        return b;
}

std::ostream& operator<<(std::ostream& os, ConvertedString str){
        os << str.string;
        return os;
}
std::ostream& operator<<(std::ostream& os, const char* str){
        char* c = new char[strlen(str)+1];
        os << convert(str, c);
        delete[] c;
        return os;
}

int main(){
        cout << "abcdef" << endl;
        return 0;
}

очень странная отмазка "именно этого там я не нашел." я порадовался (:
а если тебе на работе дадут задание написать прогу, ты будешь искать именно это прогу в книгах? а потом начальству так и скажешь: "вот именно такую программу не нашел"???
мало читать Страуструпа. надо еще и думать.
причем, желательно головой, а не жопой всем остальным....
слава роботам!
Спасибо сказали:
Аватара пользователя
MPak
Сообщения: 24

Re: Каракули в консоле на С++ и как с этим бороться

Сообщение MPak »

очень странная отмазка "именно этого там я не нашел." я порадовался (:

Извини, я не так выразился... Кстати, спасибо за ф-ции, правда я сам уже переписал
из другой книги. Нашел всетаки...
ЭТО- РУССКИЙ ТАНК
.............._~__
........___/__o_\=====>>>
......./||||||||||||||||\
......(@@@@@@@@@)
Скопируйте его в свою подпись чтобу предотвратить
Доминацию над миром Американского кролика Банни
Спасибо сказали: