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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.74
OVSite
171 / 169 / 6
Регистрация: 22.08.2010
Сообщений: 1,251
22.08.2010, 16:47     Консоль без русского ! #1
Начал учить C++ но сталкнулся с проблемой когда пишу консольную программу русский язык заменяет на непонятно какие буквы подскажите в чём дело ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mencey
 Аватар для Mencey
145 / 92 / 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.08.2010, 21:32     Консоль без русского ! #22
Цитата Сообщение от Mencey Посмотреть сообщение
Вот мой алгоритм ничего сложного:
Лучше открывать файл в бинарном режиме, иначе могуть возникнуть разногласия между различными системами.
Mencey
 Аватар для Mencey
145 / 92 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 16:11     Консоль без русского ! #26
Цитата Сообщение от Lavroff Посмотреть сообщение
wchar_t Str[]="Привет";
wchar_t str[] = L"Привет";
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2010, 16:12     Консоль без русского ! #27
Andrew_Lvov, Извиняюсь) Но проблемы с выводом русского в консоли без манипуляций это не уладит. Верно?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 16:14     Консоль без русского ! #28
Только cout, к-рый вообще-то является екземпляром класса basic_ostream<char>, не умеет работать с строчками типа wchar_t, т.к. это просто тайпдеф на unsigned int (если не ошибаюсь).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 16:26     Консоль без русского ! #30
Очевидно, wchar_t затайпдефлен иначе, чем в линуксовских либах. У меня wchar_t cout воспринимает тупо как указатель.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2010, 16:33     Консоль без русского ! #31
Andrew_Lvov, В Си он действительно был затайпдефлен. А в С++ - встроенный
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 18:57     Консоль без русского ! #32
Цитата Сообщение от Lavroff Посмотреть сообщение
Andrew_Lvov, В Си он действительно был затайпдефлен. А в С++ - встроенный
Судя по википедии, зависит от компилятора/библиотек. В Вики не рекомендуют использовать для кроссплатформенных аппликаций, но у меня в wchar_t мало опыта, посему трудно сказать.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2010, 21:54     Консоль без русского ! #33
Andrew_Lvov, Страуструп пишет, что по стандарту должно быть встроено. Но тут уж компиляторы как хотят так делают видимо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2010, 22:28     Консоль без русского !
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
30.08.2010, 22:28     Консоль без русского ! #34
Цитата Сообщение от Lavroff Посмотреть сообщение
Andrew_Lvov, Страуструп пишет, что по стандарту должно быть встроено. Но тут уж компиляторы как хотят так делают видимо
Я был неправ.
Итого, в на линуксе wchar_t - это именно этот тип, а не тайпдеф. Кстати, на тайпдеф typeid вообще ничего не выдаёт. Странно.

Ошибка моя была в попытке вывести wchar_t* через cout. Он же воспринял данные как указатель, выдав в консоль адрес в памяти. Хотя вывод wcout << "Test\n" получился на ура.
Yandex
Объявления
30.08.2010, 22:28     Консоль без русского !
Ответ Создать тему
Опции темы

Текущее время: 17:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru