Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.74
OVSite
171 / 169 / 6
Регистрация: 22.08.2010
Сообщений: 1,251
#1

Консоль без русского ! - C++

22.08.2010, 16:47. Просмотров 3921. Ответов 33
Метки нет (Все метки)

Начал учить C++ но сталкнулся с проблемой когда пишу консольную программу русский язык заменяет на непонятно какие буквы подскажите в чём дело ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2010, 16:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Консоль без русского ! (C++):

После ввода русского слова, на консоль выводятся краказябры - C++
#include <iostream> using namespace std; int main() { setlocale(LC_ALL,"Russian"); string a;

Как очистить консоль , без мигания - C++
Доброго времени суток. Пишу консольную игру на С++ , и нужно постоянно перерисовывать консоль. Но при очистке/записи в консоль...

Написать программу, которая предлагает пользователю ввести число и выводит в консоль все числа, на которые введенное делится без остатка - C++
Написать программу, которая предлагает пользователю ввести число и выводит в консоль все числа, на которые введенное делится без остатка. ...

Написать программу, которая предлагает пользователю ввести число и выводит в консоль все числа, на которые введенное делится без остатка - C++
Написать программу, которая предлагает пользователю ввести число и выводит в консоль все числа, на которые введенное делится без остатка. ...

Фильтрация русского текста - C++
есть задача. Создать программу, фильтрующую текст, введенный с клавиатуры. Задача программы заключается в считывании текста и...

Вывод русского текста - C++
Привет, я тут упражнение из книжки делаю. Там класс с переменными, содержащими имя (тип string) и ID работника (long). Я все сделал, но...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Errorman
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 8
28.08.2010, 13:10 #16
Цитата Сообщение от Mencey Посмотреть сообщение
Самый простой способ пользоваться досовским редактором или редактором с функцией перевода в файла в досовскую кодировку кстати такую утилиту(переводящую русские буквы в досовкую кодировку) можно сделать самому, что в больших программах неплохая оптимизация!

Добавлено через 2 минуты
ссылка удалена
А как ее в программу добавить ?? Скачал Unicode и что с ним делать дальше как им пользоваться при написании программ??

Добавлено через 1 минуту
Цитата Сообщение от M128K145 Посмотреть сообщение
Errorman, сделайте и это
Я не могу понять как это сделать в консоле
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
28.08.2010, 13:14 #17
Правой кнопкой по верхнему фрейму консоли -> Свойства -> Шрифт -> меняете
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.08.2010, 13:15 #18
Errorman,
На счёт предложенного мной способа, можно весь код добавить в файлик printr.h, засунуть его в ...\Dev-Cpp\include и в самой программе просто писать #include <printr.h>. Конечно не дело в хидере писать исполняемый код, но тут ода маленькая функция, думаю, не повредит.
Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
28.08.2010, 15:26 #19
За пять минут написал программу которая переводит файл в MS-DOS кодировку.
Кстати файл Main.cpp я перевёл в досовскую кодировку с помощью этой программы. Тоько коментарии потом исправил.

Вот иходник и exe-шник.
Вложения
Тип файла: zip InDos.zip (130.7 Кб, 38 просмотров)
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
28.08.2010, 16:37 #20
Mencey, а enca почему-то говорит, что у Main.cpp неизвестная кодировка, хотя кодировку 866 она распознает спокойно

Не по теме:

В Linux есть утилита iconv, которая позволяет производить перекодировку. Правда, там нет проблем с отображением русских символов к консоли.
А для perl есть модуль Text::Iconv (если верить документации, он предоставляет интерфейс к вышеупомянутой утилите), с помощью которого можно легко написать скрипт, который будет перекодировать отдельные файлы (или группы файлов) в требуемую кодировку

Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
28.08.2010, 20:56 #21
Вот мой алгоритм ничего сложного:
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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(void)
{
  FILE *fin, *fout;
  char fname_in[256], fname_out[256], buf[1024], buf_rus[1024];
  printf("Enter a file name: ");
  scanf("%s", &fname_in);
  strcat( strcpy( fname_out, "DOS" ), fname_in );
  if( !(fin = fopen( fname_in, "r" )) )  
    return 1;
  if( !(fout = fopen( fname_out, "w" )) ) 
    return 1;   
  while( fgets( buf, 1024, fin ) )
  {
    CharToOem( buf, buf_rus );
    fprintf( fout, "%s", buf_rus );
  } 
  if( feof( fin ) ) 
    return 1;
  printf("Create \"%s\" file finished.", fname_out);
  getchar();    
  return 0;
}
Добавлено через 15 минут
Например если передать программе файл main.c, то на выходе будет файл DOSmain.c в досовской кодировке.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.08.2010, 21:32 #22
Цитата Сообщение от Mencey Посмотреть сообщение
Вот мой алгоритм ничего сложного:
Лучше открывать файл в бинарном режиме, иначе могуть возникнуть разногласия между различными системами.
Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
28.08.2010, 22:19 #23
Забыл в прошлом варианте закрыть файлы, а за совет с бинарным режимом спасибо вот новая версия, но её я не компилировал:

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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(void)
{
  FILE *fin, *fout;
  char fname_in[256], fname_out[256], buf[1024], buf_rus[1024];
  int n;
  printf("Enter a file name: ");
  scanf("%s", &fname_in);
  strcat( strcpy( fname_out, "DOS" ), fname_in );
  if( !(fin = fopen( fname_in, "rb" )) )  
    return 1;
  if( !(fout = fopen( fname_out, "wb" )) ) 
    return 1;   
  while( n = fread( buf, 1024, 1, fin ) )
  {
    buf[n] = '\0';
    CharToOem( buf, buf_rus );
    fwrite( buf_rus, n, 1, fout );
  } 
  if( feof( fin ) ) 
    return 1;
  printf("Create \"%s\" file finished.", fname_out);
  fclose( fin );
  fclose( fout );
  getchar();    
  return 0;
}
Errorman
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 8
30.08.2010, 15:50 #24
В учебнике Р. Лафоре по ООП С++ нашел упоминание символьного типа wchar_t. Только там ни чего про него не понятно какой препроцессор ее содержит и как она вообще работает?? может кто знает. Возможно ли с помощью нее решить проблему вывода русского языка ???
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2010, 15:58 #25
Errorman, wchar_t - расширенный символ (юникод). Грубо говоря в char - под символ 1 байт, в wchar_t - 2 байта. С русским не поможет.

C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
   std::cout<<sizeof(wchar_t)<<'\n';
   return 0;
}
C++
1
wchar_t Str[]="Привет";
error C2440: 'initializing' : cannot convert from 'const char [7]' to 'wchar_t []'
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 16:11 #26
Цитата Сообщение от Lavroff Посмотреть сообщение
wchar_t Str[]="Привет";
wchar_t str[] = L"Привет";
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2010, 16:12 #27
Andrew_Lvov, Извиняюсь) Но проблемы с выводом русского в консоли без манипуляций это не уладит. Верно?
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 16:14 #28
Только cout, к-рый вообще-то является екземпляром класса basic_ostream<char>, не умеет работать с строчками типа wchar_t, т.к. это просто тайпдеф на unsigned int (если не ошибаюсь).
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2010, 16:19 #29
Andrew_Lvov, cout и с wstring насколько я понял не умеет работать

Добавлено через 3 минуты
Однако от оно как:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
{
   _wsetlocale(LC_ALL, L"rus"); 
   std::wstring Str=L"Привет";
   std::cout<<sizeof(char)<<'\n';
   std::cout<<sizeof(wchar_t)<<'\n';
   std::wcout<<Str<<'\n';
   return 0;
}
И аналогично с wchar_t

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
{
   _wsetlocale(LC_ALL, L"rus"); 
   wchar_t*Str=L"Привет";
   std::cout<<sizeof(char)<<'\n';
   std::cout<<sizeof(wchar_t)<<'\n';
   std::wcout<<Str<<'\n';
   return 0;
}
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 16:26 #30
Очевидно, wchar_t затайпдефлен иначе, чем в линуксовских либах. У меня wchar_t cout воспринимает тупо как указатель.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2010, 16:26
Привет! Вот еще темы с ответами:

Подключение русского языка - C++
Недавно нашла,как сделать так,чтобы на экране отображались на русском языке не только фразы из cout&lt;&lt;, но и которые вводятся с...

кодировка русского шрифта - C++
/*вроде в консоли выходят русский шрифт, но когда выводится новый массив то выходят какие каракули) посмотрите пожалуйста кто умеет*/ ...

ввод русского текста в c++ - C++
при вводе русского вопроса &quot;кто ты?&quot; программа не воспринимает его. и выводит &quot;I can't answer for this question. What is the answer?&quot;. Т.е....

Запрограммировать правило русского языка - C++
Правило написания букв И - Е в корнях с чередованием (-бер-, -бир(а)-, -дер-, -дир(а)- и т.д.). Например, собирать, соберет, сочетание.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.08.2010, 16:26
Ответ Создать тему
Опции темы

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