Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
171 / 169 / 1
Регистрация: 22.08.2010
Сообщений: 1,251

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

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

Студворк — интернет-сервис помощи студентам
Начал учить C++ но сталкнулся с проблемой когда пишу консольную программу русский язык заменяет на непонятно какие буквы подскажите в чём дело ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.08.2010, 16:47
Ответы с готовыми решениями:

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

Чтение русского текста в String через консоль
Есть код public class JavaApplication1 { public static void main(String args) throws IOException { String str =...

Не выводит текст в консоль, открывается пустая консоль без текста
Приложение должно вызывать консоль при выполнении каких то условий. В консоль записывается текст и ReadKey чтобы консоль не...

33
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
28.08.2010, 20:56
Студворк — интернет-сервис помощи студентам
Вот мой алгоритм ничего сложного:
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 в досовской кодировке.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
28.08.2010, 21:32
Цитата Сообщение от Mencey Посмотреть сообщение
Вот мой алгоритм ничего сложного:
Лучше открывать файл в бинарном режиме, иначе могуть возникнуть разногласия между различными системами.
0
 Аватар для Mencey
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
28.08.2010, 22:19
Забыл в прошлом варианте закрыть файлы, а за совет с бинарным режимом спасибо вот новая версия, но её я не компилировал:

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;
}
0
0 / 0 / 0
Регистрация: 20.08.2010
Сообщений: 8
30.08.2010, 15:50
В учебнике Р. Лафоре по ООП С++ нашел упоминание символьного типа wchar_t. Только там ни чего про него не понятно какой препроцессор ее содержит и как она вообще работает?? может кто знает. Возможно ли с помощью нее решить проблему вывода русского языка ???
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.08.2010, 15:58
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 []'
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 16:11
Цитата Сообщение от Lavroff Посмотреть сообщение
wchar_t Str[]="Привет";
wchar_t str[] = L"Привет";
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.08.2010, 16:12
Andrew_Lvov, Извиняюсь) Но проблемы с выводом русского в консоли без манипуляций это не уладит. Верно?
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 16:14
Только cout, к-рый вообще-то является екземпляром класса basic_ostream<char>, не умеет работать с строчками типа wchar_t, т.к. это просто тайпдеф на unsigned int (если не ошибаюсь).
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.08.2010, 16:19
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;
}
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 16:26
Очевидно, wchar_t затайпдефлен иначе, чем в линуксовских либах. У меня wchar_t cout воспринимает тупо как указатель.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.08.2010, 16:33
Andrew_Lvov, В Си он действительно был затайпдефлен. А в С++ - встроенный
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 18:57
Цитата Сообщение от Lavroff Посмотреть сообщение
Andrew_Lvov, В Си он действительно был затайпдефлен. А в С++ - встроенный
Судя по википедии, зависит от компилятора/библиотек. В Вики не рекомендуют использовать для кроссплатформенных аппликаций, но у меня в wchar_t мало опыта, посему трудно сказать.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.08.2010, 21:54
Andrew_Lvov, Страуструп пишет, что по стандарту должно быть встроено. Но тут уж компиляторы как хотят так делают видимо
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 22:28
Цитата Сообщение от Lavroff Посмотреть сообщение
Andrew_Lvov, Страуструп пишет, что по стандарту должно быть встроено. Но тут уж компиляторы как хотят так делают видимо
Я был неправ.
Итого, в на линуксе wchar_t - это именно этот тип, а не тайпдеф. Кстати, на тайпдеф typeid вообще ничего не выдаёт. Странно.

Ошибка моя была в попытке вывести wchar_t* через cout. Он же воспринял данные как указатель, выдав в консоль адрес в памяти. Хотя вывод wcout << "Test\n" получился на ура.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2010, 22:28

Без вызова появляется консоль
namespace Project2 { class MainClass { static void Main() { //MyForm form = new MyForm(); ...

Консоль закрывается без ответа
#include &lt;stdio.h&gt; int main() { printf(&quot;Chto posmotret ?\n&quot;); printf(&quot;1.Arrow\n&quot;); printf(&quot;2.Supernatural\n&quot;); ...

Консоль - Вывод текста без остановки
Проблема в том, что когда пишу код типа этого: Writeln('Lol'); Readln; то программа дальше не продолжает свои действия, требует...

Вывести текст в базовую консоль ПК (без ОС)
Здравствуйте! Подскажите пожалуйста, можно ли вывести строку &quot;Hello World!&quot; без операционной системы? Т.е. я скомпилированный файл запущу...

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
BitTorrent (версия 7.11 English) и Меню Настройки
russiannick 15.11.2026
Пункты, отвечающие за отключение обновлений в BitTorrent версии 7. 11 (английской) Options Preferences General Language
Транслитерация текста с кириллицы на латиницу (вариант №4)
Maks 15.11.2026
Что-то я перемудрил с предыдущими версиями, в этот раз сделал всё проще, обратившись к функции "СтрокаЛатиницей" из типового общего модуля "СтроковыеФункцииКлиент". В данной функции нет апострофов,. . .
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru