Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Кирилица в консоли (http://forum.oszone.net/showthread.php?t=129824)

YackoN 25-12-2003 11:02 207103

Как сделать, чтобы консольные проги, написанные на С++, понимали русский... Я вообще новичок в программинге, можно по подробней??? Заранее спасибо!

Guest 25-12-2003 15:33 207104

from Xwine :locale.h тебе поможет

from Xwine
ну так открой "Дейтла и Дейтла" там подробно описано какие функции использовать и какие значения задавать .

bilytur 26-12-2003 02:51 207107

YackoN

Есть такая функция в мастае CharToOem()
Поищи в WinAPI.

Перед выводом на консоль обработай строку этой функцией
Она конвертнет Win->Dos. И на экране все будет по русски а не по китайски. :)

А вообще-то где-то на этом форуме уже это было.
Удачи!


YackoN 26-12-2003 11:20 207108

Cпасибо!:)

exdocent 31-12-2003 18:06 207109

YackoN
Если имеется в виду текст на русском языке, то нужно сделать следующее:
Во-первых нужно создать заголовочный файл
Код:

#include <windows.h>
Во-вторых сменить кодировку. Для этого в коде программы ввести
Код:

SetConsoleOutputCP(1251);
В-третьих настроить консоль. Для этого нужно щелкнуть правой кнопкой по верхней части консоли. В открывшемся меню выбрать "свойства", затем на вкладке "шрифт" выбрить Lucida Console

ezdefighter 16-12-2004 10:20 280541

Кириллица?
 
Как сделать так, чтобы в консольных приложениях отображалась кириллица?

mrcnn 16-12-2004 12:00 280577

Можно использовать WinAPI функцию CharToOem():
Цитата:

CharToOem......Windows 95 Windows NT

Description
CharToOem translates a string from the character set of the current locale to an OEM-defined character set. If a character exists in the OEM character set, the character is used; otherwise, the nearest equivalent is selected.
Syntax
BOOL CharToOem( LPCTSTR lpszSource, LPSTR lpszDest )
Parameters
lpszSource
LPCTSTR: A pointer to a null-terminated string of the current character set.
lpszDest
LPSTR: A pointer to destination buffer to receive the OEM-based string. This buffer may be the same address as lpszSource, in which case the translation is performed in place. This cannot be done if using the wide-character version of this function.
Returns
BOOL: Always returns TRUE.
Include File
winuser.h
See Also
CharToOemBuff, OemToChar
Пример на C:
Код:

#include <windows.h>
#include <stdio.h>

void main()
{
        char src[10];
        char dest[10];
        strcpy(src,"Привет");
        CharToOem(src,dest);
        printf(dest);
}

или же написать собственную процедуру перекодировки

Savant 18-12-2004 19:24 281291

Рискну предположить что такое прокатит:

Код:

uses Windows;
 
function Win2Oem (S: String) : String;
begin
  CharToOem(PChar(S),PChar(Result));
end;


Mashuto 20-01-2005 13:42 290363

Русские символы в Visual С++
 
Простите, если такой вопрос уже был, но все-таки: как сделать чтобы Visual C++ 6.0 выводил нормальный русские буквы, а не "крякозяблы"?

Savant 20-01-2005 13:55 290366

Если Вы про консольный режим, то:
1. Откройте исходник
2. File -> Advanced Save Options -> Encoding -> Cyrillic (DOS) - Codepage 866

Правда у меня VS.NET, но я думаю, что эти же опции (или подобные) должны быть и у Вас ;)

Savant 26-01-2005 19:25 292400

Еще об одном способе узнал:
Цитата:

SetConsoleOutputCP

The SetConsoleOutputCP function sets the output code page used by the console associated with the calling process. A console uses its output code page to translate the character values written by the various output functions into the images displayed in the console window.


BOOL SetConsoleOutputCP(
UINT wCodePageID
);

Parameters
wCodePageID
[in] Identifier of the code page to set. The identifiers of the code pages available on the local computer are stored in the registry under the following key.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage


Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
A code page maps 256 character codes to individual characters. Different code pages include different special characters, typically customized for a language or a group of languages. If the current font is a fixed-pitch Unicode font, SetConsoleOutputCP changes the mapping of the character values into the glyph set of the font, rather than loading a separate font each time it is called. This affects how extended characters (ASCII value greater than 127) are displayed in a console window. However, if the current font is a raster font, SetConsoleOutputCP does not affect how extended characters are displayed.

To determine a console's current output code page, use the GetConsoleOutputCP function. To set and retrieve a console's input code page, use the SetConsoleCP and GetConsoleCP functions.

hasherfrog 26-01-2005 22:52 292447

Savant
Я только добавлю, что
Цитата:


Client: Included in Windows XP, Windows 2000 Professional, and Windows NT Workstation.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT Server.
Header: Declared in Wincon.h; include Windows.h.
Library: Use Kernel32.lib.

Обратите внимание, про Win 9x нет ни слова. Хотя они уже вымирают, конечно.

А вообще subj уже обсуждался, в подробностях, даже дважды, емнип...

Etenity 29-03-2005 14:49 311109

*Решено* | (Builder) C++ -> ASCII + ANSI
 
Помогите плиз. Я считываю спомощю функции fopen, fread, fwrite с ASCII файла данные, но например в ShowMessage они отображаются как ANSI текст. И вот я никак немогу найти как зделать чтобы текст в переменой типа char или String перевести с ASCII в ANSI или с ANSI в ASCII.

Savant 29-03-2005 15:02 311110

а MSDN для кого ? http://msdn.microsoft.com

CharToOem Function

The CharToOem function translates a string into the OEM-defined character set.

Syntax
BOOL CharToOem(
LPCTSTR lpszSrc, LPSTR lpszDst);
Parameters
lpszSrc [in] Pointer to the null-terminated string to translate.

lpszDst [out] Pointer to the buffer for the translated string. If the CharToOem function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if CharToOem is being used as a wide-character function.
OemToChar Function


The OemToChar function translates a string from the OEM-defined character set into either an ANSI or a wide-character string.

Syntax

BOOL OemToChar(


LPCSTR lpszSrc, LPTSTR lpszDst);
Parameters


lpszSrc [in] Pointer to a null-terminated string of characters from the OEM-defined character set.

lpszDst [out] Pointer to the buffer for the translated string. If the OemToChar function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if OemToChar is being used as a wide-character function.

Etenity 30-03-2005 01:09 311276

О спасибо тебе Старожил :) Не пойму как я не мог найти ету функцию в справке? Хотя искал все что связано с словом ОЕМ...

sasha11 29-09-2006 14:48 491213

C++ | Кодировка символов
 
вот, очередной тупой вопрос !!! такая проблема:

Код:

#include <iostream>
using namespace std;
int main()
{
  cout <<"привет";
  return 0;
}

а в место привет, какие-то "закаручки" если в место привет, написать hello, то отобразится hello !!!!!!!!!!

ivank 29-09-2006 15:03 491219

sasha11
А вот у меня "привет" пишет! А почему? потому что вопрос кодировки ортогонален вопросу языка, а зависит только от среды. У меня всё в UTF8 - и текст программы, и кодировка в консоли. У вас же исходный текст в windows-1251 (а следовательно и слово "привет"), а стандартная кодировка в консоли windows - oem866 (досовская). Отсюда и все проблемы.

Есть как минимум 4 способа побороть эту проблему. Все они уже на этом форуме были перечислены не раз. Я уже говорил вам, что стоит пользоваться поиском прежде чем задавать вопросы? В следующий раз буду просто тупо закрывать тему.

Ссылки на существующие темы с тем же вопросом:
http://forum.oszone.net/showthread.php?t=64366
http://forum.oszone.net/showthread.php?t=30066
http://forum.oszone.net/showthread.php?t=29861
http://forum.oszone.net/showthread.php?t=42553
http://forum.oszone.net/showthread.php?t=47358
http://forum.oszone.net/showthread.php?t=44139

sasha11 29-09-2006 15:38 491239

все понял, просто я в поиске ввел "кодировка в C++", "кодировка", и ничего нужного не нашел !!! в следующий раз буду делать более расширенные запросы(в поиске) !!!!!!

Durson 05-10-2008 21:02 916569

Кирилица в консоли
 
Учитывая, что архив с файлом автор удалил из своего сообщения (видимо из-за нехватки места), а скачивать неоткуда, было принято решение оформить шапку темы, в котором будет выложено содержимое заголовочного файла. ;)

Если кому надо, то могу кинуть билиотеку что бы после компиляции программы на Microsoft Visual C++ 6.0 она отображала шрифт кирилицы. Создать заголовочный файл russian.h Содержимое russian.h
Код:

#include <iostream.h>
#include <windows.h>

char* Rus(const char* text);

char bufRus[256];
char* Rus(const char* text)
{
  CharToOem(text, bufRus);
  return bufRus;
}

Подключать
Код:

#include "russian.h"

Drongo 05-10-2008 21:11 916579

Durson, а откомпилированая программа, если её запустить на другом компе, не потребует при запуске эту библиотеку?

Durson 05-10-2008 21:25 916590

Вро де бы нет, проверь?

ну что никто ещё не проверил? )

Admiral 05-10-2008 21:51 916614

Durson, прога библиотеку не спросила. Что за DLLка такая?

Drongo 05-10-2008 21:53 916617

Durson, Нормально, кирилица работает. Конечно выкладывай, не мне так другим поможешь. Это значит ты пишешь в коде:

Код:

...
  cout<<"Привет мир, добро пожаловать в мир программирования С++"<<endl;
...

И всё? Больше ничего не надо? А есть такая библиотека для Borland C++Builder 6.0 :)

Durson 05-10-2008 21:54 916620

Блин не библиотечный файл а заголовочный. :)

Durson 05-10-2008 21:58 916623

Цитата:

Цитата Drongo
И всё? Больше ничего не надо? А есть такая библиотека для Borland C++Builder 6.0 »

А эта для Microsoft Visual C++.
Выкладываю

Drongo 05-10-2008 22:02 916629

Durson, У меня такое предупреждение выдаёт:
Код:

[C++ Предупреждение] rus.h(6): W8058 Cannot create pre-compiled header: initialized data in header
Я что-то не так делаю?

Admiral 05-10-2008 22:08 916637

Durson, такой файл можно написать прямо в посте, что б его и гости форума видели
Цитата:

Цитата Durson -> rus.rar
#include <iostream.h>
#include <windows.h>
char* Rus1(const char* text);


char bufRus[256];
char* Rus1(const char* text){
CharToOem(text, bufRus);
return bufRus;
}
>>


Drongo 05-10-2008 22:23 916647

Ребята, подскажите как это можно прикрутить к моему Borland'y ?

Admiral 05-10-2008 22:24 916648

Drongo, а что он ругается на этот код, если поместить его прямо в файл cpp? Сам я Borland Builder только один раз клацал, мне показалось, что откомпилированные проги на нём дают такую же скорость как и Delphi, по этому не используюсь этим компилятором C\C++. Но вопрос выбора компилятора оставим для другой темы. :wink:

Drongo 05-10-2008 22:32 916656

Не не ругается, компилится с предупреждением, но текст всё равно иероглифами, в общем так есть папка, скажем - Folder в неё кладу файлы HelloWorld.cpp и rus.h подключаю заголовочный файл
Код:

#include <iostream.h>
#include <conio.h>
#include "rus.h"
void main()
{
  cout<<" Добро пожаловать в мир программирования"<<endl;

  getch();
}

и всё равно ничего не помогает... как будто он его игнорирует. А если закинуть rus.h в папку Include то не ругается, но всё равно символы кривые.

Admiral 05-10-2008 22:39 916663

Drongo, так нужно ж так cout<<Rus1(" Добро пожаловать в мир программирования")<<endl; файл то подключается, а функция Rus1() с него не задействуется.

Drongo 05-10-2008 22:48 916669

Admiral, Точно!!!! Браво! :victory: :clapping: Как я мог так тормознуть! :laugh: Сам же подобное писал недавно:
Было дело
Код:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

char* rus(char* st);

int main()
{
    int z;       

  cout<<rus("  Привет, добро пожаловать в мир программирования")<<endl;
  cin>>z; 
  return 0;
}
// Функция отображения русских символов--------------------------------------
char* rus(char* st)
{
    unsigned char* p = st;  // при объявлении символов как char русские буквы
                                      // кодируются отрицательными числами
    while( *p ){
        if(*p >= 192) // здесь русская буква
            if(*p <= 239)
              *p -= 64;
            else
              *p -= 16;
        p++;
    }
    return st;
}

Так а если что, можно же попробовать заменить содержимое заголовочного файла, этим кодом? Надо попробовать, завтра!

Admiral 05-10-2008 22:53 916675

Drongo, такое бывает у всех, ведь мы же люди.
Да конечно, всегда возможно по разносить функции по файлам, именно для этого и придумали include. Компилеру все равно, он их перед компиляцией соединяет в один и компилит целиком.

Drongo 05-10-2008 23:01 916684

Admiral, Durson, Ну ребята! Спасибо Вам за файл и объяснения! :yahoo: :yes: :up

Durson 06-10-2008 10:41 916887

Цитата:

Цитата Admiral
Сам я Borland Builder только один раз клацал, мне показалось, что откомпилированные проги на нём дают такую же скорость как и Delphi, по этому не используюсь этим компилятором C\C++. Но вопрос выбора компилятора оставим для другой темы. »

Проги написанные на Borland занимают меньше места чем программы написанные на Delphi

Цитата:

Цитата Admiral
ак нужно ж так cout<<Rus1(" Добро пожаловать в мир программирования")<<endl; »

Кстатии можно отредактировать заголовочный файл так что бы вместо Rus1("") писать Ru или Rus.
Для того что бы вместо Rus1("") писать Rus("") нужно изменить библиотечный файл:
Код:

#include <iostream.h>
#include <windows.h>
char* Rus(const char* text);


char bufRus[256];
char* Rus(const char* text){
        CharToOem(text, bufRus);
        return bufRus;
}


Drongo 06-10-2008 11:33 916926

Durson,
Цитата:

Цитата Durson
Кстатии можно отредактировать заголовочный файл так что бы вместо Rus1("") писать Ru или Rus. »

Я уже вчера так и сделал: :)
Заголовочный файл назвал - russian.h
Функцию - Rus
Единственный вопрос. В заголовочном файле russian.h есть ещё заголовочные файлы
Код:

#include <iostream.h>
#include <windows.h>

зачем первый, если в проге он уже имеется? Я пробовал #include <iostream.h> удалять, и без него всё работало как надо. Так зачем он там нужен?

Durson 06-10-2008 12:26 916960

В новую программу эти заголовочные файлы уже можно не писать :)

Drongo 06-10-2008 12:50 916979

Durson,
Цитата:

Цитата Durson
эти заголовочные файлы уже можно не писать »

Не, этот нужен - #include <windows.h> :yes:

Durson 06-10-2008 20:24 917327

Цитата:

Цитата Drongo
Не, этот нужен - #include <windows.h> »

В программе или заголовочном файле? Если в программе то почему он нужен?

Drongo 06-10-2008 20:43 917350

Durson, В самом заголовочном файле нужен :) Тоесть так:
Вид сбоку

HelloWorld.cpp
Код:

// Привет мир программирования, приветствие.
#include <iostream.h>
#include <conio.h>
#include "russian.h"

void main()
{
  cout<<Rus(" Добро пожаловать в мир программирования")<<endl;

  getch();
}

russian.h
Код:

/*  #include <iostream.h> можно удалить эту строку из "russian.h"  */
#include <windows.h>

char* Rus(const char* text);
char bufRus[256];

char* Rus(const char* text)
{
  CharToOem(text, bufRus);
  return bufRus;
}


SS3 17-01-2009 21:16 1010887

Использывание русского языка при написании программы
 
Подскажите как мне использовать русские символы при написании программы.
Пишу на на Dev-C++( http://www.bloodshed.net/ )
OC :Windows Vista Ultimate SP1.
А то надоело писать
Код:

Vvedite symmy 4isel
, хотелось бы
Код:

Введите сумму чисел

Busla 17-01-2009 21:56 1010937

Универсальный совет: "поиграйте" кодировкой файла с исходным кодом. В какой кодировке сохраняете сейчас? Какое приложение пишете - консольное или GUI?

Если не секрет, почему используете компилятор, у которого последний релиз датирован 2000 годом?

SS3 17-01-2009 22:20 1010968

Цитата:

Цитата Busla
Какое приложение пишете - консольное или GUI? »

Консольное

Искал в "Сервис->Параметры компилятора" но так и не нашол кодировку.
Я помню, когда учился писать на Turbo Pascal 7.0 то что бы можна было б писать русскими символами нужно было, какие-то файлы кидать в System 32, это на Windows XP

Pliomera 18-01-2009 03:32 1011158

Цитата:

Цитата SS3
А то надоело писать
Код:
Vvedite symmy 4isel, хотелось бы
Код:
Введите сумму чисел »

Может лучше написать: Enter the sum of numbers, please... ? :)

Busla 18-01-2009 13:05 1011374

можно сменить кодовую страницу консоли командой chcp, а потом запускать ваше приложение
можно в нормальном редакторе вписать кириллицу, потом откомпилировать
концептуально правильнее символьные строки хранить во внешнем файле, а не в коде

SS3 19-01-2009 00:13 1012092

Вложений: 1
Вот я на оф. форуме нашол файлы которые позволяют использование русского языка:
Код:

config.h.in, configure, configure.in, COPYING, INSTALL, koi.1, Makefile.in, README, rus.1, rus.c
Читал INSTALL но так нечего и не понял.
Может кто поможет мне в это проблеме.
В архиве нет вирусов, так что можете свободно качать)

Drongo 25-01-2009 16:19 1018922

SS3, Прочитайте с самого начала, возможно решение предложенное Durson'ом, вам подойдёт.

ganselo 25-01-2009 17:01 1018963

Видил в книге "Павловска ООП" пример написания класса для ввода/вывода кириллицы. Там при вызове cout/cin из заголовочного файла iostream.h подменялись на "наши" cout/cin и тем самым текст написанный на кириллице выводился нормально. Код проги предназначался для компиляции на Visual C++ 6.0. Увы данного компилятора у меня не было и поэтому я не смог потестировать(побывал компилировать на MinGW, но было куча не понятных ошибок).

Drongo 25-01-2009 21:06 1019193

Цитата:

Цитата ganselo
Там при вызове cout/cin из заголовочного файла iostream.h подменялись на "наши" cout/cin и тем самым текст написанный на кириллице выводился нормально. »

Можно ли выложить содержимое "наших" cout/cin? Или их самих?

ganselo 26-01-2009 21:03 1020448

Цитата:

Цитата Drongo
Можно ли выложить содержимое "наших" cout/cin? Или их самих? »

Вот этот вариант:
Код:

//файл CyrIOS.h
#ifndef CYR_IOS_H
#define CYR_IOS_H
#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>
using namespace std;

#define MAX_STR_LEN 4096

//////////////////////////////////////////////////////////////////////////////////
// Класс CyrOstream
class CyrOstream : public ostream {
        public:
                CyrOstream(_Uninitialized no_init) : ostream(no_init) {};
                CyrOstream& operator <<(_Myt& (_cdecl *_f)(_Myt&));
                CyrOstream& operator <<(ios_base& (_cdecl *_f)(ios_base& ));
                CyrOstream& operator <<(short n) { cout << n; return *this; }
                CyrOstream& operator <<(unsigned short n){ cout << n; return *this; }
                CyrOstream& operator <<(int n) { cout << n; return *this; }
                CyrOstream& operator <<(unsigned int n){ cout << n; return *this; }
                CyrOstream& operator <<(long n) { cout << n; return *this; }
                CyrOstream& operator <<(unsigned long n) { cout << n; return *this; }
                CyrOstream& operator <<(float f) { cout << f; return *this; }
                CyrOstream& operator <<(double f) { cout << f; return *this; }
                CyrOstream& operator <<(long double f) { cout << f; return *this; }
                CyrOstream& operator <<(const void* v) { cout << v; return *this; }
                CyrOstream& operator <<(const char*);
                CyrOstream& operator <<(const unsigned char* s) { operator <<((const char*)s); return *this; }
                CyrOstream& operator <<(const signed char* s) { operator <<((const char*)s); return *this; }
                CyrOstream& operator <<(char);
                CyrOstream& operator <<(unsigned char);
                CyrOstream& operator <<(signed char c) { operator <<((char)c); return *this; }
                CyrOstream& put(char);
                CyrOstream& write(const char*, int);
                CyrOstream& write(const unsigned char* s, int len)
                {       
                        write((const char*)s, len); return *this;
                }
                // Замещение методов класса ios
                long setf(long lFlags) { return cout.setf(lFlags); }
                void unsetf(long lFlags) { cout.unsetf(lFlags); }
                char fill(char cFill) { return cout.fill(cFill); }
                char fill() { return cout.fill(); }
                int precision(int np) { return cout.precision(np); }
                int precision() const { return cout.precision(); }
                int width(int nw) { return cout.width(nw); }
                int width() const { return cout.width(); }
                int rdstate() const { return cout.rdstate(); }
                long flags() const { return cout.flags(); }
                long flags(long _l) { return cout.flags(_l); }
                streambuf* rdbuf() const { return cout.rdbuf(); }
                // Дружественная функция для поддержки параметризованных манипуляторов
                friend CyrOstream& operator <<(CyrOstream&, const _Smanip<int>&);
        private:
                char buf_[MAX_STR_LEN];
};

////////////////////////////////
// Шаблон для вывода типа string
template<class _E, class _Tr, class _A>
inline CyrOstream& operator <<(CyrOstream& os, const basic_string<_E, _Tr, _A>& _X)
{
        string temp(_X);
        unsigned char symb[2];
        symb[1] = 0;
        for (int i = 0; i < temp.size(); i++)
        {
                symb[0] = temp.at(i);
                if (symb[0] > 191)
                CharToOem((const char*)symb, (char*)symb);
                cout << symb;
        }
return os;
}

///////////////////////////////////////////////////////////
// Класс CyrIstream
class CyrIstream : public istream {
        public:
                CyrIstream(_Uninitialized no_init) : istream(no_init) {};
                CyrIstream& operator >>(ios_base& (_cdecl *_f)(ios_base& ));
                CyrIstream& operator >>(char*);
                CyrIstream& operator >>(unsigned char* s)
                {
                        operator >>((char*)s); return *this;
                }
                CyrIstream& operator >>(signed char* s)
                {
                        operator >>((char*)s); return *this;
                }
                CyrIstream& operator >>(char& c);
                CyrIstream& operator >>(unsigned char& c)
                {
                        operator >>((char&)c); return *this;
                }
                CyrIstream& operator >>(signed char& c)
                {
                        operator >>((char&)c); return *this;
                }
                CyrIstream& operator >>(short &n) { cin >> n; return *this; }
                CyrIstream& operator >>(unsigned short &n)
                {
                        cin >> n; return *this;
                }
                CyrIstream& operator >>(int &n) { cin >> n; return *this; }
                CyrIstream& operator >>(unsigned int &n)
                {
                        cin >> n; return *this;
                }
                CyrIstream& operator >>(long &n) { cin >> n; return *this; }
                CyrIstream& operator >>(unsigned long &n)
                {
                        cin >> n; return *this;
                }
                CyrIstream& operator >>(float &f) { cin >> f; return *this; }
                CyrIstream& operator >>(double &f) { cin >> f; return *this; }
                CyrIstream& operator >>(long double &f)
                {
                        cin >> f; return *this;
                }
                int get() { return cin.get(); }
                CyrIstream& get(char&);
                CyrIstream& get(char*, int, char='\n');
                CyrIstream& get(unsigned char*, int, char = '\n');
                CyrIstream& getline(char*, int, char='\n');
                CyrIstream& getline(unsigned char* pch, int nCount, char delim ='\n')
                {
                        getline((char*)pch, nCount, delim); return *this;
                }
                CyrIstream& read(char*, int);
                CyrIstream& read(unsigned char* pch, int nCount)
                {
                        read((char*)pch, nCount); return *this;
                }
                CyrIstream& ignore(int nCount = 1, int delim = EOF)
                {
                        cin.ignore(nCount, delim); return *this;
                }
                int peek() { return cin.peek(); }
                int gcount() const { return cin.gcount(); }
                CyrIstream& putback(char ch) { cin.putback(ch); return *this; }
                // Замещение методов класса ios
                void clear(int nState = 0) { cin.clear(nState); }
                long setf(long lFlags) { return cin.setf(lFlags); }
                void unsetf(long lFlags) { cin.unsetf(lFlags); }
                int rdstate() const { return cin.rdstate(); }
                long flags() const { return cin.flags(); }
                streambuf* rdbuf() const { return cin.rdbuf(); }
                // Дружественная функция для поддержки параметризованных манипуляторов
                friend CyrIstream& operator >>(CyrIstream&, const _Smanip<int>&);
        private:
                char buf_[MAX_STR_LEN];       
};

/////////////////////////////////////////////////////////////
//Шаблон для ввода типа string
template<class _E, class _Tr, class _A>
inline CyrIstream& operator >>(CyrIstream& is, basic_string<_E, _Tr, _A>& _X)
{
        string temp;
        cin >> temp;
        unsigned int n = temp.size();
        char *buf = new char[n+1];
        temp.copy(buf, n); buf[n] = 0;
        OemToChar(buf, (char*)buf);
        _X = string(buf);
        delete [] buf;
return is;
}

CyrOstream& CyrOstream::operator << (_Myt& (_cdecl *_f)(_Myt&))
{
        cout << _f; return *this;
}
CyrOstream& CyrOstream::operator << (ios_base& (_cdecl *_f)(ios_base& ))
{
        cout << _f; return *this;
}

CyrOstream& CyrOstream::operator <<(const char *s)
{
        int n = strlen(s);
        strncpy(buf_, s, n); buf_[n] = 0;
        CharToOem(buf_, buf_);
        cout << buf_;
return *this;
}

CyrOstream& CyrOstream::operator <<(char c)
{
        buf_[0] = c; buf_[1] = 0;
        CharToOem(buf_, buf_);
        cout << buf_;
return *this;
}

CyrOstream& CyrOstream::operator <<(unsigned char c)
{
        unsigned char buf[2];
        buf[0] = c; buf[1] = 0;
        if (c > 191)
                CharToOem((const char*)buf, (char*)buf);
        cout << buf;
return *this;
}

CyrOstream& CyrOstream::put(char c)
{
        buf_[0] = c; buf_[1] = 0;
        CharToOem(buf_,  buf_);
        cout.put(buf_[0]);
return *this;
}

CyrOstream& CyrOstream::write(const char* s, int len)
{
        int n = strlen(s);
        strncpy(buf_, s, n); buf_[n] = 0;
        CharToOem(buf_, buf_);
        cout.write(buf_, len);
return *this;
}
CyrOstream& operator <<(CyrOstream& os, const _Smanip<int>& m)
{
        cout << m; return os;
}

CyrIstream& CyrIstream::operator >> (ios_base& (_cdecl *_f)(ios_base& ))
{
        cin >> _f; return *this;
}
CyrIstream& CyrIstream::operator >>(char* s)
{
        string temp;
        cin >> temp;
        unsigned int n = temp.size();
        temp.copy(buf_, n); buf_[n] = 0;
        OemToChar(buf_, buf_);
        strncpy (s, buf_, n + 1);
return *this;
}

CyrIstream& CyrIstream::operator >>(char& c)
{
        cin >> buf_[0];
        buf_[1] = 0;
        OemToChar(buf_, buf_);
        c = buf_[0];
return *this;
}


CyrIstream& CyrIstream::get(char& symb)
{
        cin.get(buf_[0]);
        buf_[1] = 0;
        OemToChar(buf_, buf_);
        symb = buf_[0];
return *this;
}

CyrIstream& CyrIstream::get(char* pch, int nCount, char delim)
{
        cin.get(pch, nCount, delim);
        OemToChar(pch, pch);
return *this;
}

CyrIstream& CyrIstream::get(unsigned char* pch, int nCount, char delim)
{
        cin.get((char*)pch, nCount, delim);
        OemToChar((const char*)pch, (char*)pch);
return *this;
}

CyrIstream& CyrIstream::getline(char* pch, int nCount, char delim)
{
        cin.getline(pch, nCount, delim);
        OemToChar(pch, pch);
return *this;
}

CyrIstream& CyrIstream::read(char* pch, int nCount)
{
        cin.read(buf_, nCount);
        buf_[nCount] = 0;
        OemToChar(buf_, buf_);
        for(int i = 0; i < nCount; i++)
                pch[i] = buf_[i];
return *this;
}

CyrIstream& operator >>(CyrIstream& is, const _Smanip<int>& m)
{
        cin >> m; return is;
}

//////////////////////////////////////////////////////////
// Глобальные объекты для ввода и вывода
CyrIstream Cin(_Noinit);
CyrOstream Cout(_Noinit);


///////////////////////////////////////////////////////////
extern CyrIstream Cin;
extern CyrOstream Cout;
#endif

#ifndef CYR_IOS_IMPLEMENTATION
        #define cin Cin
        #define cout Cout
        #define istream CyrIstream
        #define ostream CyrOstream
#endif

Работает только в Visual Studio.
Вызов:
Код:

#include "CyrIOS.h" //смотря как назовёте
using namespace std;

int main()
{
        char str[100];
        string a = "Привет мир С++";
        cout << "Привет мир С++" << endl;
        cin.getline(str, 100);
        cout << str;
        cout a;
return 0;
}

Думаю данный вариант более элегантнее...

hda0 03-02-2009 00:36 1027812

Зачем так усложнять код программы, вот самый простой способ как отобразить в консоли русский язык:
Нужно открыть все волишь командную строку cmd.
Потом для удобства перейти на рабочий стол вот так:

cd "Рабочий стол" <Enter>
Documents and Settings\hda0\Рабочий стол>[/i]

А дальше, все еще проще.

echo Привет, вот и русский язык в консоли > rus.txt

Всё.
На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.
За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!

XEN_STRANGER 20-03-2009 21:44 1069751

Помогите включить кирилицу в Win32 console Application
 
Я в C++ новичёк, пишу простенькую прогу Win32 console Application (запускается она не в windows-окне,а в командной строке). Так вот при выводе на экран текста на русском, кириллические символы не отображаются, точне выводятся каляки. Например:

cout << "Введите число от 1 до 10" << endl;

Фраза на кирилице не пашет, а писать русские слова английскими буквами не прилично. Помню, что кто-то делал поддержку кирилицы, но как????????????????

Alan85 20-03-2009 22:30 1069809

вот что могу предложить:
Код:

#include <iostream>
#include <windows.h>
using namespace std;

char* convert(char* str)
{
  char* s;
  CharToOemA(str,s); // сама конвертация
  return s;
}
int main(int argc, char* argv[])
{
 cout<<convert("привет");
 cin.get();
 return 0;
}


XEN_STRANGER 21-03-2009 13:51 1070250

Alan85,

Цитата:

Цитата Alan85
#include <iostream>
#include <windows.h>
using namespace std;
char* convert(char* str)
{
char* s;
CharToOemA(str,s); // сама конвертация
return s;
}
int main(int argc, char* argv[])
{
cout<<convert("привет");
cin.get();
return 0;
} »

Этот твой код после сборки и запуска exe вылетает.

Alan85, Admiral, hda0, Drongo, Durson, YackoN, Busla, ganselo, SS3,

К сожалению ни один из способов, приведённых выше, у меня не прокатил (возможно я делаю что-то не так)... Кто-нибудь объясните пошагово, я начал заниматься с++ только 3 месяца назад и мне только 15 лет.

Как вывести в консоли:

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
cout << "Ура, получилось!" << endl;
return 0;
}

Моя прога очень длинная и там очень много cout <<'оф, поэтому нужно сделать так, чтобы не пришлось всё переписывать, а добавить в заголовке какой-нить include. Вобщем если так нельзя то всё равно помогите....

Кодю я в Microsoft Visual C++ 6.0
Моя прога во вложении.

Alan85 21-03-2009 18:55 1070478

вот что получилось:
Код:

// Windows XP SP3; BDS 2006; 21.03.2009;
// основано на материале с http://cboard.cprogramming.com/showthread.php?p=745558
#include <iostream>
#include <windows.h>
using namespace std;

typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);    // прототип недокументированый функции
 SETCONSOLEFONT SetConsoleFont;

int main(int argc, char* argv[])
{
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");    // функция здесь
  SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");  // берем ее адрес
  if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}  //  если ошибка
  SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
  //эксперементально установил что в обычной XP  это Lucida  Console 14.
  //хз везде это ли - покажет практика.
  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
  cout<<"по русски :)";
  cin.get();
  return 0;
}


Alan85 21-03-2009 19:19 1070503

В Vista и Windows 7 не работает :(

Alan85 21-03-2009 20:22 1070560

сделал для Vista и XP одновременно (проверял на Vista SP1) :
Код:

// Windows XP SP3; BDS 2006; 21.03.2009;
// основано на материале с http://cboard.cprogramming.com/showthread.php?p=745558
//  http://msdn.microsoft.com/en-us/library/ms686200(VS.85).aspx
#include <iostream>
#include <windows.h>
using namespace std;

typedef struct _CONSOLE_FONT_INFOEX {
  ULONG cbSize;
  DWORD nFont;
  COORD dwFontSize;
  UINT  FontFamily;
  UINT  FontWeight;
  WCHAR FaceName[LF_FACESIZE];
} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;

typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);    // прототип недокументированый функции для XP

typedef BOOL (WINAPI *SETCURRENTCONSOLEFONTEX)(HANDLE,BOOL, PCONSOLE_FONT_INFOEX);  // для vista
SETCURRENTCONSOLEFONTEX SetCurrentConsoleFontEx  ;
SETCONSOLEFONT SetConsoleFont;

int main(int argc, char* argv[])
{
  OSVERSIONINFOEX osvi;
  CONSOLE_FONT_INFOEX cfon;
  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  GetVersionEx((OSVERSIONINFO *) &osvi) ;  // получение версии винды
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");    // функции здесь
  if (osvi.dwMajorVersion<6) {    // xp или ниже : для 9x не проверял.
        SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");  // берем  адрес функции
        if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}  //  если ошибка
        SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
        //эксперементально установил что в обычной XP  это Lucida  Console 14.
        //хз везде это ли - покажет практика.

  }  else
  {
        SetCurrentConsoleFontEx =(SETCURRENTCONSOLEFONTEX) GetProcAddress(hmod, "SetCurrentConsoleFontEx");  // берем  адрес  функции
        if (!SetCurrentConsoleFontEx) {cout<<"error\n" ; exit(1);}  //  если ошибка
        ZeroMemory(&cfon, sizeof(CONSOLE_FONT_INFOEX));
        cfon.cbSize=sizeof(CONSOLE_FONT_INFOEX);
        //cfon.nFont=10;
        cfon.FontFamily=54;  //  Lucida  Console
        if (!SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), false, &cfon)) cout<<"error";
  }

  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
  cout<<"по русски :)";
  cin.get();
  return 0;
}

А на Windows 7 7000 не пошло.. хз может потому что бета.

Drongo 21-03-2009 20:46 1070583

Цитата:

Цитата XEN_STRANGER
К сожалению ни один из способов, приведённых выше, у меня не прокатил »

Попробуйте ещё так
Код:

#include <iostream>
#include <windows.h>
using namespace std;

// Функция перекодировки в кирилицу
char* rus(char* st)
{
    unsigned char* p = st;  // при объявлении символов как char русские буквы
                                      // кодируются отрицательными числами
    while( *p ){
        if(*p >= 192) // здесь русская буква
            if(*p <= 239)
              *p -= 64;
            else
              *p -= 16;
        p++;
    }
    return st;
}


int main()
{
  cout << rus("Ура, получилось!") << endl;
  cin.get();
  return 0;
}


XEN_STRANGER 21-03-2009 20:52 1070590

Alan85, Ура, спасибо тебе великое

Drongo, А твой пример при компиляции ссылается на:
error C2440: 'initializing' : cannot convert from 'char *' to 'unsigned char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

hda0 21-03-2009 21:08 1070599

Зачем так усложнять код программы, вот самый простой способ как отобразить в консоли русский язык:
Нужно открыть все волишь командную строку cmd.
Потом для удобства перейти на рабочий стол вот так:

cd "Рабочий стол" <Enter>
Documents and Settings\hda0\Рабочий стол>

А дальше, все еще проще.

echo Привет, вот и русский язык в консоли > rus.txt

Всё.
На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.
За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!

Alan85 21-03-2009 21:18 1070606

hda0, данный метод подходит для статического текста, а если например у нас большая база данных из другого источника (с кодировкой 1251) . Да и само по себе генерация файла потом копирование информации от туда в исходники имхо костыли еще те... и не понятно как потом не запутаться что есть где смотря все это в 1251 кодировке (разве что повторно набирать тот же текст)

Drongo 21-03-2009 21:24 1070610

Цитата:

Цитата XEN_STRANGER
Drongo, А твой пример при компиляции ссылается на:
error C2440: 'initializing' : cannot convert from 'char *' to 'unsigned char *' »

Ну, наверное тип передаваемого параметра сменить попробовать в unsigned char
Вместо
Код:

...
// Функция перекодировки в кирилицу
char* rus(char* st)
{
...

на такой
Код:

...
// Функция перекодировки в кирилицу
char* rus(unsigned char* st)
{
...


hda0 21-03-2009 21:27 1070612

Без проблем. Если есть far, то там в редактировании файла можно сразу же поставить кодировку dos, и спокойно писать на русском языке, ну незнаю, просто то что я написал, занимает очень мало кода и мне например очень удобно через far писать, а вообще я думаю написать собственный редактор сразу с кодировкой dos, и с сохранением файла с расширением bat.

ganselo 27-03-2009 16:41 1076368

Вот вариант своего класса для ввода/вывода на кириллице
(для Visual C++ 5.0 и более поздних)
Код:

#ifndef CYR_IOS_H
#define CYR_IOS_H
#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>
using namespace std;

#define MAX_STR_LEN 4096

//////////////////////////////////////////////////////////////////////////////////
// Класс CyrOstream
class CyrOstream : public ostream {
        public:
                CyrOstream(_Uninitialized no_init) : ostream(no_init) {};
                CyrOstream& operator <<(_Myt& (_cdecl *_f)(_Myt&));
                CyrOstream& operator <<(ios_base& (_cdecl *_f)(ios_base& ));
                CyrOstream& operator <<(short n) { cout << n; return *this; }
                CyrOstream& operator <<(unsigned short n){ cout << n; return *this; }
                CyrOstream& operator <<(int n) { cout << n; return *this; }
                CyrOstream& operator <<(unsigned int n){ cout << n; return *this; }
                CyrOstream& operator <<(long n) { cout << n; return *this; }
                CyrOstream& operator <<(unsigned long n) { cout << n; return *this; }
                CyrOstream& operator <<(float f) { cout << f; return *this; }
                CyrOstream& operator <<(double f) { cout << f; return *this; }
                CyrOstream& operator <<(long double f) { cout << f; return *this; }
                CyrOstream& operator <<(const void* v) { cout << v; return *this; }
                CyrOstream& operator <<(const char*);
                CyrOstream& operator <<(const unsigned char* s) { operator <<((const char*)s); return *this; }
                CyrOstream& operator <<(const signed char* s) { operator <<((const char*)s); return *this; }
                CyrOstream& operator <<(char);
                CyrOstream& operator <<(unsigned char);
                CyrOstream& operator <<(signed char c) { operator <<((char)c); return *this; }
                CyrOstream& put(char);
                CyrOstream& write(const char*, int);
                CyrOstream& write(const unsigned char* s, int len)
                {       
                        write((const char*)s, len); return *this;
                }
                // Замещение методов класса ios
                long setf(long lFlags) { return cout.setf(lFlags); }
                void unsetf(long lFlags) { cout.unsetf(lFlags); }
                char fill(char cFill) { return cout.fill(cFill); }
                char fill() { return cout.fill(); }
                int precision(int np) { return cout.precision(np); }
                int precision() const { return cout.precision(); }
                int width(int nw) { return cout.width(nw); }
                int width() const { return cout.width(); }
                int rdstate() const { return cout.rdstate(); }
                long flags() const { return cout.flags(); }
                long flags(long _l) { return cout.flags(_l); }
                streambuf* rdbuf() const { return cout.rdbuf(); }
                // Дружественная функция для поддержки параметризованных манипуляторов
                friend CyrOstream& operator <<(CyrOstream&, const _Smanip<int>&);
        private:
                char buf_[MAX_STR_LEN];
};

////////////////////////////////
// Шаблон для вывода типа string
template<class _E, class _Tr, class _A>
inline CyrOstream& operator <<(CyrOstream& os, const basic_string<_E, _Tr, _A>& _X)
{
        string temp(_X);
        unsigned char symb[2];
        symb[1] = 0;
        for (int i = 0; i < temp.size(); i++)
        {
                symb[0] = temp.at(i);
                if (symb[0] > 191)
                CharToOem((const char*)symb, (char*)symb);
                cout << symb;
        }
return os;
}

///////////////////////////////////////////////////////////
// Класс CyrIstream
class CyrIstream : public istream {
        public:
                CyrIstream(_Uninitialized no_init) : istream(no_init) {};
                CyrIstream& operator >>(ios_base& (_cdecl *_f)(ios_base& ));
                CyrIstream& operator >>(char*);
                CyrIstream& operator >>(unsigned char* s)
                {
                        operator >>((char*)s); return *this;
                }
                CyrIstream& operator >>(signed char* s)
                {
                        operator >>((char*)s); return *this;
                }
                CyrIstream& operator >>(char& c);
                CyrIstream& operator >>(unsigned char& c)
                {
                        operator >>((char&)c); return *this;
                }
                CyrIstream& operator >>(signed char& c)
                {
                        operator >>((char&)c); return *this;
                }
                CyrIstream& operator >>(short &n) { cin >> n; return *this; }
                CyrIstream& operator >>(unsigned short &n)
                {
                        cin >> n; return *this;
                }
                CyrIstream& operator >>(int &n) { cin >> n; return *this; }
                CyrIstream& operator >>(unsigned int &n)
                {
                        cin >> n; return *this;
                }
                CyrIstream& operator >>(long &n) { cin >> n; return *this; }
                CyrIstream& operator >>(unsigned long &n)
                {
                        cin >> n; return *this;
                }
                CyrIstream& operator >>(float &f) { cin >> f; return *this; }
                CyrIstream& operator >>(double &f) { cin >> f; return *this; }
                CyrIstream& operator >>(long double &f)
                {
                        cin >> f; return *this;
                }
                int get() { return cin.get(); }
                CyrIstream& get(char&);
                CyrIstream& get(char*, int, char='\n');
                CyrIstream& get(unsigned char*, int, char = '\n');
                CyrIstream& getline(char*, int, char='\n');
                CyrIstream& getline(unsigned char* pch, int nCount, char delim ='\n')
                {
                        getline((char*)pch, nCount, delim); return *this;
                }
                CyrIstream& read(char*, int);
                CyrIstream& read(unsigned char* pch, int nCount)
                {
                        read((char*)pch, nCount); return *this;
                }
                CyrIstream& ignore(int nCount = 1, int delim = EOF)
                {
                        cin.ignore(nCount, delim); return *this;
                }
                int peek() { return cin.peek(); }
                int gcount() const { return cin.gcount(); }
                CyrIstream& putback(char ch) { cin.putback(ch); return *this; }
                // Замещение методов класса ios
                void clear(int nState = 0) { cin.clear(nState); }
                long setf(long lFlags) { return cin.setf(lFlags); }
                void unsetf(long lFlags) { cin.unsetf(lFlags); }
                int rdstate() const { return cin.rdstate(); }
                long flags() const { return cin.flags(); }
                streambuf* rdbuf() const { return cin.rdbuf(); }
                // Дружественная функция для поддержки параметризованных манипуляторов
                friend CyrIstream& operator >>(CyrIstream&, const _Smanip<int>&);
        private:
                char buf_[MAX_STR_LEN];       
};

/////////////////////////////////////////////////////////////
//Шаблон для ввода типа string
template<class _E, class _Tr, class _A>
inline CyrIstream& operator >>(CyrIstream& is, basic_string<_E, _Tr, _A>& _X)
{
        string temp;
        cin >> temp;
        unsigned int n = temp.size();
        char *buf = new char[n+1];
        temp.copy(buf, n); buf[n] = 0;
        OemToChar(buf, (char*)buf);
        _X = string(buf);
        delete [] buf;
return is;
}

CyrOstream& CyrOstream::operator << (_Myt& (_cdecl *_f)(_Myt&))
{
        cout << _f; return *this;
}
CyrOstream& CyrOstream::operator << (ios_base& (_cdecl *_f)(ios_base& ))
{
        cout << _f; return *this;
}

CyrOstream& CyrOstream::operator <<(const char *s)
{
        int n = strlen(s);
        strncpy(buf_, s, n); buf_[n] = 0;
        CharToOem(buf_, buf_);
        cout << buf_;
return *this;
}

CyrOstream& CyrOstream::operator <<(char c)
{
        buf_[0] = c; buf_[1] = 0;
        CharToOem(buf_, buf_);
        cout << buf_;
return *this;
}

CyrOstream& CyrOstream::operator <<(unsigned char c)
{
        unsigned char buf[2];
        buf[0] = c; buf[1] = 0;
        if (c > 191)
                CharToOem((const char*)buf, (char*)buf);
        cout << buf;
return *this;
}

CyrOstream& CyrOstream::put(char c)
{
        buf_[0] = c; buf_[1] = 0;
        CharToOem(buf_,  buf_);
        cout.put(buf_[0]);
return *this;
}

CyrOstream& CyrOstream::write(const char* s, int len)
{
        int n = strlen(s);
        strncpy(buf_, s, n); buf_[n] = 0;
        CharToOem(buf_, buf_);
        cout.write(buf_, len);
return *this;
}
CyrOstream& operator <<(CyrOstream& os, const _Smanip<int>& m)
{
        cout << m; return os;
}

CyrIstream& CyrIstream::operator >> (ios_base& (_cdecl *_f)(ios_base& ))
{
        cin >> _f; return *this;
}
CyrIstream& CyrIstream::operator >>(char* s)
{
        string temp;
        cin >> temp;
        unsigned int n = temp.size();
        temp.copy(buf_, n); buf_[n] = 0;
        OemToChar(buf_, buf_);
        strncpy (s, buf_, n + 1);
return *this;
}

CyrIstream& CyrIstream::operator >>(char& c)
{
        cin >> buf_[0];
        buf_[1] = 0;
        OemToChar(buf_, buf_);
        c = buf_[0];
return *this;
}


CyrIstream& CyrIstream::get(char& symb)
{
        cin.get(buf_[0]);
        buf_[1] = 0;
        OemToChar(buf_, buf_);
        symb = buf_[0];
return *this;
}

CyrIstream& CyrIstream::get(char* pch, int nCount, char delim)
{
        cin.get(pch, nCount, delim);
        OemToChar(pch, pch);
return *this;
}

CyrIstream& CyrIstream::get(unsigned char* pch, int nCount, char delim)
{
        cin.get((char*)pch, nCount, delim);
        OemToChar((const char*)pch, (char*)pch);
return *this;
}

CyrIstream& CyrIstream::getline(char* pch, int nCount, char delim)
{
        cin.getline(pch, nCount, delim);
        OemToChar(pch, pch);
return *this;
}

CyrIstream& CyrIstream::read(char* pch, int nCount)
{
        cin.read(buf_, nCount);
        buf_[nCount] = 0;
        OemToChar(buf_, buf_);
        for(int i = 0; i < nCount; i++)
                pch[i] = buf_[i];
return *this;
}

CyrIstream& operator >>(CyrIstream& is, const _Smanip<int>& m)
{
        cin >> m; return is;
}

//////////////////////////////////////////////////////////
// Глобальные объекты для ввода и вывода
CyrIstream Cin(_Noinit);
CyrOstream Cout(_Noinit);


///////////////////////////////////////////////////////////
extern CyrIstream Cin;
extern CyrOstream Cout;
#endif

#ifndef CYR_IOS_IMPLEMENTATION
        #define cin Cin
        #define cout Cout
        #define istream CyrIstream
        #define ostream CyrOstream
#endif

Вот вариант для компилятора mingw (всякие там Code::Blocks, Dev C++ и т.д)
Код:

#ifndef RUS_H_INCLUDED
#define RUS_H_INCLUDED
#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>
#define MAX_STR_LEN 4096

class CyrOstream : public std::ostream
{
    public:
        CyrOstream() : std::ostream() {}
        CyrOstream& operator <<(__ostream_type& (*__pf)(__ostream_type&))
        {
            std::cout << __pf; return *this;
        }
        CyrOstream& operator <<(__ios_type& (*__pf)(__ios_type&))
        {
            std::cout << __pf; return *this;
        }
        CyrOstream& operator <<(ios_base& (*__pf)(ios_base&))
        {
            std::cout << __pf; return *this;
        }
        CyrOstream& operator <<(short n) { std::cout << n; return *this; }
                CyrOstream& operator <<(unsigned short n) { std::cout << n; return *this; }
                CyrOstream& operator <<(int n) { std::cout << n; return *this; }
                CyrOstream& operator <<(unsigned int n) { std::cout << n; return *this; }
                CyrOstream& operator <<(long n) { std::cout << n; return *this; }
                CyrOstream& operator <<(long long n) {std::cout << n; return *this; }
                CyrOstream& operator <<(unsigned long n) { std::cout << n; return *this; }
                CyrOstream& operator <<(float f) { std::cout << f; return *this; }
                CyrOstream& operator <<(double f) { std::cout << f; return *this; }
                CyrOstream& operator <<(long double f) { std::cout << f; return *this; }
                CyrOstream& operator <<(const void* v) { std::cout << v; return *this; }
                CyrOstream& operator <<(const char*);
                CyrOstream& operator <<(const unsigned char* s) { std::cout << s; return *this;}
                CyrOstream& operator <<(const signed char* s) { std::cout << s; return *this;}
                CyrOstream& operator <<(char);
                CyrOstream& operator <<(unsigned char);
                CyrOstream& operator <<(signed char c) { operator <<((char)c); return *this; }
                CyrOstream& operator <<(std::streambuf *buf) { std::cout << buf; return *this; }

                CyrOstream& put(char);
                CyrOstream& write(const char*, int);
                CyrOstream& write(const unsigned char* s, int len);

        char fill(char cFill) { return std::cout.fill(cFill); }
                char fill() { return std::cout.fill(); }
                int precision(int np) { return std::cout.precision(np); }
                int precision() const { return std::cout.precision(); }
                int width(int nw) { return std::cout.width(nw); }
                int width() const { return std::cout.width(); }
                int rdstate() const { return std::cout.rdstate(); }

        friend CyrOstream& operator <<(CyrOstream&, std::_Setprecision __f);
                friend CyrOstream& operator <<(CyrOstream&, std::_Resetiosflags __f);
                friend CyrOstream& operator <<(CyrOstream&, std::_Setiosflags __f);
                friend CyrOstream& operator <<(CyrOstream&, std::_Setbase __f);
                friend CyrOstream& operator <<(CyrOstream&, std::_Setfill<wchar_t> __f);
                friend CyrOstream& operator <<(CyrOstream&, std::_Setw __f);

                template<typename _CharT, typename _Traits, typename _Alloc>
        friend CyrOstream& operator <<(CyrOstream& os,
            const std::basic_string<_CharT, _Traits, _Alloc>& __str);
    private:
        char buf_[MAX_STR_LEN];
};
//=======================================================================
//=======================================================================
class CyrIstream : public std::istream
{
    public:
        CyrIstream() : std::istream() {}
        CyrIstream& operator >>(ios_base& (*__pf)(ios_base&))
        {
            std::cin >> __pf; return *this;
        }
        CyrIstream& operator >>(char*);
        CyrIstream& operator >>(unsigned char* s)
                {
                        operator >>((char*)s); return *this;
                }
                CyrIstream& operator >>(signed char* s)
                {
                        operator >>((char*)s); return *this;
                }
                CyrIstream& operator >>(char& c);
                CyrIstream& operator >>(unsigned char& c)
                {
                        operator >>((char&)c); return *this;
                }
                CyrIstream& operator >>(signed char& c)
                {
                        operator >>((char&)c); return *this;
                }
                CyrIstream& operator >>(short &n) { std::cin >> n; return *this; }
                CyrIstream& operator >>(unsigned short &n)
                {
                        std::cin >> n; return *this;
                }
                CyrIstream& operator >>(int &n) { std::cin >> n; return *this; }
                CyrIstream& operator >>(unsigned int &n)
                {
                        std::cin >> n; return *this;
                }
                CyrIstream& operator >>(long &n) { std::cin >> n; return *this; }
                CyrIstream& operator >>(unsigned long &n)
                {
                        std::cin >> n; return *this;
                }
                CyrIstream& operator >>(float &f) { std::cin >> f; return *this; }
                CyrIstream& operator >>(double &f) { std::cin >> f; return *this; }
                CyrIstream& operator >>(long double &f)
                {
                        std::cin >> f; return *this;
                }
                int get() { return std::cin.get(); }
                CyrIstream& get(char&);
                CyrIstream& get(char*, int, char='\n');
                CyrIstream& get(unsigned char*, int, char = '\n');
                CyrIstream& getline(char*, int, char='\n');
                CyrIstream& getline(unsigned char* pch, int nCount, char delim ='\n')
                {
                        getline((char*)pch, nCount, delim); return *this;
                }
                CyrIstream& read(char*, int);
                CyrIstream& read(unsigned char* pch, int nCount)
                {
                        read((char*)pch, nCount); return *this;
                }
                CyrIstream& ignore(int nCount = 1, int delim = EOF)
                {
                        std::cin.ignore(nCount, delim); return *this;
                }
                int peek() { return std::cin.peek(); }
                int gcount() const { return std::cin.gcount(); }
                CyrIstream& putback(char ch) { std::cin.putback(ch); return *this; }

                // Замещение методов класса ios
                //void clear(int nState = 0) { std::cin.clear(nState); }
                //long setf(long lFlags) { return std::cin.setf(lFlags); }
                //void unsetf(long lFlags) { std::cin.unsetf(lFlags); }
                int rdstate() const { return std::cin.rdstate(); }
                long flags() const { return std::cin.flags(); }
                std::streambuf* rdbuf() const { return std::cin.rdbuf(); }

        friend CyrIstream& operator >>(CyrIstream&, std::_Setprecision __f);
                friend CyrIstream& operator >>(CyrIstream&, std::_Resetiosflags __f);
                friend CyrIstream& operator >>(CyrIstream&, std::_Setiosflags __f);
                friend CyrIstream& operator >>(CyrIstream&, std::_Setbase __f);
                friend CyrIstream& operator >>(CyrIstream&, std::_Setfill<wchar_t> __f);
                friend CyrIstream& operator >>(CyrIstream&, std::_Setw __f);

                template<typename _CharT, typename _Traits, typename _Alloc>
        friend CyrIstream& operator >>(CyrIstream& os,
            const std::basic_string<_CharT, _Traits, _Alloc>& __str);
        private:
                char buf_[MAX_STR_LEN];
};

//=======================================================================
//Методы класса CyrOstream
//=======================================================================
CyrOstream& CyrOstream::operator <<(const char *s)
{
    int n = strlen(s);
    strncpy(buf_, s, n); buf_[n] = '\0';
    CharToOem(buf_, buf_);
    std::cout << buf_;
    return *this;
}
//=======================================================================
CyrOstream& CyrOstream::operator <<(char c)
{
        buf_[0] = c; buf_[1] = 0;
        CharToOem(buf_, buf_);
        std::cout << buf_;
return *this;
}
//=======================================================================
CyrOstream& CyrOstream::operator <<(unsigned char c)
{
        unsigned char buf[2];
        buf[0] = c; buf[1] = 0;
        if (c > 191)
                CharToOem((const char*)buf, (char*)buf);
        std::cout << buf;
    return *this;
}
//======================================================================
//======================================================================
CyrOstream& CyrOstream::put(char c)
{
    buf_[0] = c; buf_[1] = 0;
        CharToOem(buf_,  buf_);
        std::cout.put(buf_[0]);
    return *this;
}
//======================================================================
CyrOstream& CyrOstream::write(const char* s, int len)
{
        int n = strlen(s);
        strncpy(buf_, s, n); buf_[n] = 0;
        CharToOem(buf_, buf_);
        std::cout.write(buf_, len);
return *this;
}
//======================================================================
CyrOstream& CyrOstream::write(const unsigned char* s, int len)
{
    write((const char*)s, len);
    return *this;
}
//======================================================================
CyrOstream& operator <<(CyrOstream &os, std::_Setprecision __f)
{
    std::cout << __f;
    return os;
}
//======================================================================
CyrOstream& operator <<(CyrOstream &os, std::_Resetiosflags __f)
{
    std::cout << __f;
    return os;
}
//======================================================================
CyrOstream& operator <<(CyrOstream &os, std::_Setiosflags __f)
{
    std::cout << __f;
    return os;
}
//======================================================================
CyrOstream& operator <<(CyrOstream &os, std::_Setbase __f)
{
    std::cout << __f;
    return os;
}
//======================================================================
CyrOstream& operator <<(CyrOstream &os, std::_Setfill<wchar_t> __f)
{
    std::cout << __f._M_c;
    return os;
}
//======================================================================
CyrOstream& operator <<(CyrOstream &os, std::_Setw __f)
{
    std::cout << __f;
    return os;
}
//======================================================================
template<typename _CharT, typename _Traits, typename _Alloc>
CyrOstream& operator <<(CyrOstream& os,
    const std::basic_string<_CharT, _Traits, _Alloc>& __str)
{
    std::string temp(__str);
        unsigned char symb[2];
        symb[1] = 0;
        for (int i = 0; i < temp.size(); i++)
        {
                symb[0] = temp.at(i);
                if (symb[0] > 191)
                CharToOem((const char*)symb, (char*)symb);
                std::cout << symb;
        }
return os;
}
//=======================================================================
//Методы класса CyrIstream
//=======================================================================
//Шаблон для ввода типа string
template<typename _CharT, typename _Traits, typename _Alloc>
inline CyrIstream& operator >>(CyrIstream& is,
            const std::basic_string<_CharT, _Traits, _Alloc>& __str)
{
        std::string temp;
        std::cin >> temp;
        unsigned int n = temp.size();
        char *buf = new char[n+1];
        temp.copy(buf, n); buf[n] = 0;
        OemToChar(buf, (char*)buf);
        __str = std::string(buf);
        delete [] buf;
return is;
}
//=======================================================================
CyrIstream& CyrIstream::operator >>(char* s)
{
        std::string temp;
        std::cin >> temp;
        unsigned int n = temp.size();
        temp.copy(buf_, n); buf_[n] = 0;
        OemToChar(buf_, buf_);
        strncpy (s, buf_, n + 1);
return *this;
}
//=======================================================================
CyrIstream& CyrIstream::operator >>(char& c)
{
        std::cin >> buf_[0];
        buf_[1] = 0;
        OemToChar(buf_, buf_);
        c = buf_[0];
return *this;
}
//=======================================================================
CyrIstream& CyrIstream::get(char& symb)
{
        std::cin.get(buf_[0]);
        buf_[1] = 0;
        OemToChar(buf_, buf_);
        symb = buf_[0];
return *this;
}
//=======================================================================
CyrIstream& CyrIstream::get(char* pch, int nCount, char delim)
{
        std::cin.get(pch, nCount, delim);
        OemToChar(pch, pch);
return *this;
}
//=======================================================================
CyrIstream& CyrIstream::get(unsigned char* pch, int nCount, char delim)
{
        std::cin.get((char*)pch, nCount, delim);
        OemToChar((const char*)pch, (char*)pch);
return *this;
}
//=======================================================================
CyrIstream& CyrIstream::getline(char* pch, int nCount, char delim)
{
        std::cin.getline(pch, nCount, delim);
        OemToChar(pch, pch);
return *this;
}
//=======================================================================
CyrIstream& CyrIstream::read(char* pch, int nCount)
{
        std::cin.read(buf_, nCount);
        buf_[nCount] = 0;
        OemToChar(buf_, buf_);
        for(int i = 0; i < nCount; i++)
                pch[i] = buf_[i];
return *this;
}
//=======================================================================
CyrIstream& operator <<(CyrIstream &is, std::_Setprecision __f)
{
    std::cin >> __f;
    return is;
}
//======================================================================
CyrIstream& operator <<(CyrIstream &is, std::_Resetiosflags __f)
{
    std::cin >> __f;
    return is;
}
//======================================================================
CyrIstream& operator <<(CyrIstream &is, std::_Setiosflags __f)
{
    std::cin >> __f;
    return is;
}
//======================================================================
CyrIstream& operator <<(CyrIstream &is, std::_Setbase __f)
{
    std::cin >> __f;
    return is;
}
//======================================================================
CyrIstream& operator <<(CyrIstream &is, std::_Setfill<wchar_t> __f)
{
    std::cin.fill(__f._M_c);
    return is;
}
//======================================================================
CyrIstream& operator <<(CyrIstream &is, std::_Setw __f)
{
    std::cin >> __f;
    return is;
}
CyrOstream Cout;
CyrIstream Cin;
extern CyrOstream Cout;
extern CyrIstream Cin;
#endif

#ifndef RUS_H_INCLUDED_IMPLEMENTATION
        #define cout Cout
        #define cin Cin
        #define ostream CyrOstream
        #define istream CyrIstream
#endif

Ну и мб напишу для Borland'овских компиляторов.
Копируем например в rus.h код ну и вызывем так:
Код:

#include "rus.h" //смотря как назвали

int main()
{
    cout << "Кириллица" << endl;
return 0;
}


Admiral 03-04-2009 23:08 1083562

Всем привет!
Работая с функцией isdigit() (данная функция определяет - является ли символ числом), необходимо было проверять является ли её потенциальный аргументы латинским символом. При взятии от кириллического происходит крушение программы. Это подвело к тому, что данная функция и не нужна, раз идёт проверка символов то уже проще самостоятельно определить является ли символ числом.
Для корректной работы isdigit() с массивами символов, где может быть кириллица, нужно определять массив символов как unsigned char, а не просто char, по этому решения сабжа предполагает использования в двух вариантах.

Итак, имеет MS-DOS кодовую страницу 866 (Code Page 866 MS-DOS) применяемую в консольных приложениях для Виндовс.
Её всегда можно подсмотреть таким вот образом
Код:

for (int i=0;i<256;i++;)
        printf("%i %c %i\n",i ,i);
/*Во время выполнения кода пискнет спикер в корпусе
(если он конечно есть и не отключён в диспетчере устройств),
так должно быть.
Это управляющий неотображаемый символ '\a' идущий под номером 7.
Впрочем в Windows 7 не пищал.*/

Та абракадабра, которая отображается при не решённом сабже, так же находится здесь на равнее с корректными латинскими символами. На разнице их номеров и можно организовать правильное отображение
Код:

#include <stdio.h>
#define UNSIGNED

int main()
{
        int i=0;

#ifdef UNSIGNED
        unsigned char str []="ABC abc АБВ абв ЂЃ‚  Ўў Привет";
        while (str [i]!='\0')
        {
                if (((128+64)<=str[i])&&(str[i]<=(175+64)))
                        str[i]=str[i]-64;

                if (((224+16)<=str[i])&&(str[i]<=(236+16)))
                        str[i]=str[i]-16;

                printf("%c",str[i]);

                i++;
        }

#else
        char str []="ABC abc АБВ абв ЂЃ‚  Ўў Привет";
        while (str [i]!='\0')
        {
                if ((-64<=str[i]) && (str[i]<=-17))
                        str[i]=str[i]+192;
               
                if ((-16<=str[i]) && (str[i]<=-1))
                        str[i]=str[i]+240;

                printf("%c",str[i]);
                i++;
        }
#endif
        return 0;
}

Для тех кому не знакома конструкция #ifdef #else #endif: она на выбор предлагает скомпилировать один из участков кода, в данном случаи когда определен UNSIGNED (#define UNSIGNED) компилируется участок кода до #ifdef, между #ifdef /#else и после #endif.

strlen ведь не по зубам подсчитать длину unsigned char? Если всё же по зубам пожалуйста поправьте, а то в одной программе, где много strlen и используется isdigit() и массив char, при переходе на unsigned char не хотелось бы отказываться от неё.
Пока ориентируемся на управляющий символ конца строки '\0' и используем цикл while
В случаи char массива можно использовать цикл for, предельное значение подскажет функция strlen - for (int i=0; strlen(str); i++)

Единственное что, буква Ё и другие кириллические символы идущие в кодовой странице MS-DOS 866 с кодами после 240, не учтены в коде данной программы.

P.S.
В Windows 7 добиться отображения кириллицы в консоли с помощью данного способа не получилось. Вместо кириллицы код прогоняющий таблицу символов отобразил невнятные символы, греческий алфавит.
Юникод вариант, расписанный здесь unicode и printf ,так же не прошёл.


Спасибо за внимание.

NYX 16-12-2009 01:16 1296319

Ну вы ребят даете, громоздкие коды такие :) Сори за остроумность, на на мой взгляд загон из Win в Koi того не стоит :)
Мона сделать простую функцию, аргументом которой текст Koi, а возвратом будет Win :) Это пишется в пару строк, что то типо того:

Код:

char KoiWin(char sym)
{
shar *cWin = "Набор символов Win";
char *cKoi = "Набор противоположных символов";
for (int a = 0; a < strlen(cWin); a++)
if (sym == cKoi[a])sym = cWin[a];

return sym;
}

И перед каждым выводом к примеру это делать вполне приемлемо :) Ибо не видел консолей которые романы или дисертации
в окне выдавали :) Например для того же указания локации с русскими именами, этого вполне достаточно :)
З.Ы. - Сори если не втему, я просто полностью не читал все сообщения, тока то YackoN, что писал :)

.Земляк. 16-12-2009 21:39 1297124

Код:

char* Decode_DOS_to_Win(char * str)
 {
    unsigned char *cstr=str; // "unsigned" - чтоб избежать предупреждений комп-ра
    for(; *cstr; cstr++)
    {
        if(*cstr<128) continue; // не фиг топтаться дальше, если не нужно конвертить!
        if(*cstr>=128 && *cstr<=175)
            *cstr+=64;
        else if(*cstr>=224 && *cstr<=239)
            *cstr+=16;
        else if(*cstr==252) // №
            *cstr=185;
        else if(*cstr==240) // Ё, Е с двумя точками - Йо
            *cstr=168;
        else if(*cstr==241) //  Ё, е с двумя точками - йо
            *cstr=184;
        else if(*cstr==242) // Є, украинское Йе
            *cstr=170;
        else if(*cstr==243) // є, украинское йе
            *cstr=186;
        else if(*cstr==244) // Ї, украинское Йи
            *cstr=175;
        else if(*cstr==245) // ї, украинское йи
            *cstr=191;
        else if(*cstr==246) // Ў, беларусская У с хвостиком вверху - незнаю, как читается
            *cstr=161;
        else if(*cstr==247) // ў, беларусская У с хвостиком вверху - незнаю, как читается
            *cstr=162;
        else if(*cstr==248) // знак градуса
            *cstr=176;
        else if(*cstr==250) // маленькая центровая точка
            *cstr=183;
        else
            *cstr='?'; // некий символ, которым заменять несуществующие в CP1251
    }
    return str;
 }
//----------------------------------------------------
char* Decode_Win_to_DOS(char * str)
 {
    unsigned char *cstr=str;
    for(;*cstr;cstr++)
    {
        if(*cstr<128) continue; // не фиг топтаться дальше, если не нужно конвертить!
        if(*cstr>=240)
            *cstr-=16;
        else if(*cstr>=192)
            *cstr-=64;
        else if(*cstr==185) // №
            *cstr=252;
        else if(*cstr==168) // Ё, Е с двумя точками - Йо
            *cstr=240;
        else if(*cstr==184) //  Ё, е с двумя точками - йо
            *cstr=241;
        else if(*cstr==170) // Є, украинское Йе
            *cstr=242;
        else if(*cstr==186) // є, украинское йе
            *cstr=243;
        else if(*cstr==175) // Ї, украинское Йи
            *cstr=244;
        else if(*cstr==191) // ї, украинское йи
            *cstr=245;
        else if(*cstr==178) // I, украинское И
            *cstr=73;            // в английскую, т.к. в ДОСе нет
        else if(*cstr==179) // i, украинское и
            *cstr=105;        // в английскую, т.к. в ДОСе нет
        else if(*cstr==161) // Ў, беларусская У с хвостиком вверху - незнаю, как читается
            *cstr=246;
        else if(*cstr==162) // ў, беларусская У с хвостиком вверху - незнаю, как читается
            *cstr=247;
        else if(*cstr==176) // знак градуса
            *cstr=248;
        else if(*cstr==183) // маленькая центровая точка
            *cstr=250;
        else
            *cstr='?'; // некий символ, которым заменять несуществующие в CP1251
    }
    return str;
 }


ganselo 17-12-2009 12:01 1297526

.Земляк. , зачем это вообще нужно, ведь есть уже готовые функции (правда только в win): CharToOem(...), OemToChar(...).

prospero_ua 17-12-2009 19:15 1297930

Ну вы блин даёте!
Решение, которое точно работает в MSVS:
Код:

setlocale( LC_ALL, ".1251" );
char szText[] = "Hello! Привет!";
std::cout << (szText) << std::endl;


NYX 21-12-2009 16:42 1300846

(!!!) Видим 866, имеем 1251 (!!!) + возможность вводить пароли ***** символами :) (!!!)
Значит к какому результу я притаранился :)
Для начала в теле функции main() прописываем APIшные строки:

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Затем, у меня стоит своя собственная приблуда, которая ограничивает количество вводимых символо при помощи label: goto label; в теле
которого я тупо повесил char cWord = getch(); и если cWord != VK_RETURN, пишем в массив СИМВОЛ в кодировке 1251 а на экран выводим в кодировке 866 (OEM);
Вот листинг :)

Код:

bool GetArg(char cString[], int iSize, bool Masked)
{

int iLength = 0;
char cWord = 0;
enter_word:
cWord = getch();
if (cWord == VK_TAB)cWord = 13;
if (cWord == 22) // Paste From Clipboard
    {
    if ((iLength+Clipboard()->AsText.Length()) <= iSize)
        {
        for (int newindex = iLength; newindex < (iLength + Clipboard()->AsText.Length()); newindex++)
        cString[newindex] = Clipboard()->AsText[newindex-iLength+1];
        iLength += Clipboard()->AsText.Length();
        cout << Clipboard()->AsText.c_str();
        }
    goto enter_word;
    }

if (cWord == VK_ESCAPE)SendMessage(FindWindow("ConsoleWindowClass", NULL), WM_CLOSE, 0, 0);
if (cWord != VK_RETURN)
    {
    if (cWord != VK_BACK)
        {
        if (iLength < iSize)
            {
            cString[iLength] = cWord;
            ToWin(&cWord);
            if (Masked)
            cout << '*';
            else
            cout << cWord;
            iLength++;
            }
        }
        else
        {
        if (iLength > 0)
            {
            cout << "\b \b";
            iLength--;
            cString[iLength] = 0;
            }
        }
    goto enter_word;
    }
    else
    {
    if (strlen(cString) > (unsigned)iSize){cout << " -- Buffer oveflow (press key)"; return 0;}
    iLength = 0;
    if (strlen(cString) > 0)
        {
        return 1;
        }
    goto enter_word;
    }
}

// Кстати незаменимая штукенция на тот случай если в консоли надо ввест пароль :) последним аргументом это регулируется :)

в листинге есть вызов некой ToWin(&cWord); которая и транслирует мне 1251 в 866 :) делает она это так:
Код:

void ToWin(char *symbol)
{
for (unsigned int CPIndex = 0; CPIndex < strlen(Win); CPIndex++)
if (*symbol == Oem[CPIndex])*symbol = Win[CPIndex];
}

перед стартом проги делается это: // объявляется перед стартом потока main(); тобешь ГЛОБАЛЬНО
char Win[67];
char *Oem = "ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
CharToOem("ÀÁÂÃÄŨÆÇÈÊÉËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ", Win); // Лень переписывать (в массивы загоняются А-Я-а-я)

ФФух кажысь выложил идейку :)

Да и уж извините что офтопю, просто на радостях:
Написал штучку зугружающую картинку в консоль :)
вот она:

Код:

for(long y = 0; y < 120; ++y)
    {
    for(long x = 0; x < 400; ++x)
                {
        SetPixel(dc, x, y, logo_img[y * 400 + x]);
                  }
    }
Sleep(1000);
for(long y = 0; y < 120; ++y)
    {
    for(long x = 0; x < 400; ++x)
                {
        SetPixel(dc, x, y, 0);
                  }
    }

unsigned long logo_img[144056] = {0,0,0 ... }; // это массив который я собрал из имеющегося логотипа :) сделал это для того что бы не было зависимости вылетов в тех ситуациях, когда отсутствует логотип. Написал программку, которая делает так:

#include <assert.h>

HBITMAP hBmp = (HBITMAP)LoadImage(GetModuleHandle(0), "logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bmpInfo = {};
::GetObject(hBmp, sizeof(BITMAP), &bmpInfo);
assert(bmpInfo.bmBitsPixel / 8 == sizeof(COLORREF));
LONG nCount = bmpInfo.bmWidth * bmpInfo.bmHeight;
COLORREF* pBits = new COLORREF[nCount];
GetBitmapBits(hBmp, nCount * sizeof(COLORREF), pBits);

затем этот самый pBits[] посимвольно вывожу в файл, который формируется таким образом:
сначала добавляю строки
#ifndef MYLOGO_H
#define MYLOGO_H
unsigned long logo_img[размер pBits в байтах] = { ... далее циклом вставляю pBits[x] << ","; (!!!) // Самое главное каждые 10 выводов в файл, надо вставлять '\n' ибо компилятор будет
материться если в строке будет дофига символов :)

Да и логотип такого размера будет туговато грузиться на машинках от 900 Мгц :) так что лучше делать голотипчик размером не более 5000 байт, в таком случае он на стареньких компах
будет более менее грузиться (например проверил на Asus Eee 701 - 10кратное обновление картинки заняло около 20 сек, в то время как на 2х-яйцовом камушке эта дело занимало меньше секунды))))

Lisiy_egik 25-12-2009 02:13 1303755

вот этот файл при подключении позволяет выводить кириллицей.

подключаешь, #include "rus8.h" B main и rus8(); в самом теле main

сам хэдер
Код:

/* RUS8.H
    Универсальный включаемый файл для русского ВЫВОДА консольного
приложения ( MVS.NET2005 )

!!! ВАЖНО !!!
    1. Подключается только в файл с функцией main( )
    2. В самом начале main( ) вызвать функцию rus( )
            main( )
            {
                rus( );
                ...
            }
!!!!!!!!!!!!!

    Санкт-Петербургский Государственный Политехнический Университет
    Факультет Технической Кибернетики
    Кафедра Автоматики и вычислительной техники

    Сидорина Т.Л.
*/

#ifndef _RUS_H
    #define _RUS_H

    #include <locale.h>

    inline void rus( void )
    {   
        setlocale( LC_CTYPE, ".1251" );
        setlocale( LC_MONETARY, ".1251" );

        return;
    }

#endif


ganselo 25-12-2009 22:35 1304376

Цитата:

Цитата Lisiy_egik
при подключении позволяет выводить кириллицей »

А в моей среде разработки не работает (среда - Code Blocks, компилятор mingw). А в MSVS 2005 работает. По умолчанию в редакторе стоит кодировка Win1251 и файл сохраняется в той же кодировке.

Redisych 02-01-2010 01:07 1308922

Такая же петрушка, Code Blocks & mingw не дают кириллицу.
Я вот всё думаю, если в редакторе 1251 сменить на 866, чем это грозит? Потом в другом месте перекорёжит?

Ещё нарыл решение.
в заголовок вставляем
#include<clocale>
в main
setlocale(LC_CTYPE, "");

Тоже, почему-то, не работает.


НАШЁЛ!!!
В main прописываем:
system("chcp 1251 > nul");

nurfet 22-02-2010 11:41 1353181

#include <windows.h>

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Для ввода и отображении кирилицы

Drongo 22-02-2010 15:22 1353320

Цитата:

Цитата nurfet
Код:

#include <windows.h>
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

»

Этот способ вроде для визуалки подходит?

котвася 28-03-2010 18:38 1379216

Код:

//*******************************************************

#include <iostream>
#include <locale.h>

//*******************************************************

int main()
{
        //setlocale(LC_ALL,".1251");
        std::system("@echo привет");
        std::cout<<std::endl;
        std::system("@pause");
        return 0;
}

можно вот еще как.

nurfet 29-03-2010 10:36 1379631

#<windows.h>

int main()
{
system("chcp 1251 > nul");

И в свойствах консольного окна на вкладке шрифт выбрать Lucida Console

Redisych 10-07-2010 08:38 1450702

После долгого перерыва занялся. Свежая версия CodeBlocks 10.05 с набортным компилятором GCC.
М-дя... Ни один из способов не работает.

---upd 12/07/10
Сегодня работает. Ничего не понимаю в этом полтергейсте.

Glareone 11-07-2010 16:49 1451213

Цитата:

Цитата nurfet
#include <windows.h>
SetConsoleCP(1251);
SetConsoleOutputCP(1251); »

Цитата:

Цитата nurfet
И в свойствах консольного окна на вкладке шрифт выбрать Lucida Console »

Цитата:

Цитата nurfet
#<windows.h>
int main()
{
system("chcp 1251 > nul"); »

оба способа прекрасно работают.

soft.creator 17-10-2010 22:05 1521128

Предлагаю еще один вариант: ссылка
Может, кому и понравится.

Delirium 19-10-2010 01:31 1521948

Цитата:

Цитата soft.creator
Предлагаю еще один вариант »

Хм, я сначала подумал, что это спам или реклама. Ан нет, реальный код с примером :)

areafix 13-11-2010 21:47 1542074

Использую

Код:

#include <windows.h>
char bufRus[256];
char* RU(const char* text){
        CharToOem(text, bufRus);
        return bufRus;
}

printf(RU("печатать эту хрень %s\n"), hren);

Хотя всё работает, но на каждый *print* ругается, компилятор mingw gcc 4.5.0 (портирую код из linux) :

Цитата:

d:\usr\mingw\bin\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h:294:37: note: expected 'const char *' but argument is of type 'int'
../qs.c:369:5: warning: passing argument 1 of 'printf' makes pointer from integer without a cast

INFINFUM 20-09-2011 14:21 1756745

зачем изобретать велосипед? я так делаю:
Код:

#include "stdafx.h"
using namespace System;

void main(void)
{
    Console::Write("Кирилица");
    Console::WriteLine("С переносом на новую строку");
}


Hell_Knight 03-11-2011 13:49 1788011

Цитата:

char* Convert(char *str)
{
static char* pChar;
int i = 0;
while(str[i] != NULL)i++;
pChar = (char*)malloc(i);
CharToOemA(str, pChar);
return pChar;
}
норм работает


Время: 17:05.

Время: 17:05.
© OSzone.net 2001-