| 
| 
 | Вопрос # 3 210/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!здравствуйте, не могли бы вы мне помочь справится с одним багом что ли:
 только вот сейчас начал писать проги на С++, в С++ Buildere 2009 года
 самый последний он по-моему
 так вот создаю консольное приложение
 допустим: (смотрите приложение к вопросу)
 
 чтобы написать в консоле приходится писать английскими буквами, а русские отображаются в виде абры-кадабры
 
 это немного напрягает
 не подскажите что можно сделать?
 Приложение:Переключить в обычный режим #pragma hdrstop #include <tchar.h>#include <iostream.h>#include <iomanip.h>#pragma argsused int _tmain(int argc, _TCHAR* argv[]){float average;int counter, grade,  total; 	total=0;	counter=0; 	cout << "Vvedite ocenky ili -1 dlya       vihoda: ";	cin >> grade; 	while (grade != -1)   {	  total += grade;	  counter += 1;	  cout << "Vvedite ocenky ili -1 dlya vihoda: ";	cin >> grade;    } 	if (counter != 0) {	   average = (float) total/counter;	   cout << "Srednee znachenie ravno "                  << setprecision(2)       << setiosflags(ios::fixed | ios::showpoint)                 << average << endl;	}	cin >> total;	return 0;} 
|  |   Вопрос задал: Ruslan (статус: 1-ый класс)Вопрос отправлен: 20 сентября 2009, 15:11
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Егор Здравствуйте, Ruslan!1) Есть сайт яндекс - www.yandex.ru - набираем в поле поиска фразу "с++ русские отображаются в виде абры-кадабры". Вылезет куча ссылок на эту тему. Всё дело в кодировках - консоль использует кодировку dos - 866, а все виндовые приложения (в том числе и билдер) - кодировку Windows-1251.
 Вариантов решения масса:
 а) оставить как есть - русские сообщение не использовать вообще/писать транслитом
 б) файлы cpp открывать и писать в досовском редакторе или сохранять в дос-формате - неудобно, при открытии файла в билдере будут абра-кадабра
 в) использовать специализированные функции - CharToOem (или CharToOemA) - CharToOem работает с типом char по умолчанию, а CharToOemA - с типом char. обе функции в билдере идентичны. а вот в Visual Studio - нет. Там CharToOem работает с юникодными строками, а CharToOemA - с типом char. Так что лучше использовать CharToOemA - будет работать и там, и там.
 
 2) По "паскалю" и readln - ест в билдере аналог readkey'а - это функция getch(). если работать не будет, значит, в заголовочных файлах надо прописать #include <conio.h>
 
 Пример в приложении
 Приложение:Переключить в обычный режим //---------------------------------------------------------------------------#pragma hdrstop#include <iostream>#include <conio.h>#include <windows.h>//--------------------------------------------------------------------------- #pragma argsusedint main(int argc, char* argv[]){   CharToOemA(russtr,russtr);  std::cout << "Hello, world!n" << russtr << std::endl;  getch();	return 0;}//---------------------------------------------------------------------------
|  | Ответ отправил: Егор (статус: 10-ый класс)Время отправки: 20 сентября 2009, 17:57
 Оценка за ответ: 5
 Комментарий к оценке: спасибо!особенно за getch();!
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 21 сентября 2009, 06:29; участников в обсуждении: 2. 
|   | Ruslan (статус: 1-ый класс), 20 сентября 2009, 15:14 [#1]:кстати еще чтобы как в паскале увидеть что твориться пишем в конце кода readln;
 в С++ я пишу cin >> (любую переменную)
 можно как-нибудь делать это по-другому?
 |  
|   | Егор (статус: 10-ый класс), 20 сентября 2009, 18:17 [#2]:можно сделать отдельную функцию, назвать её, например "ToRus"  работать она будет не с типом char, а со строками - string (они намного удобнее):
 код:
 
 #pragma hdrstop
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
//---------------------------------------------------------------------------
#pragma argsused
std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}
 
int main(int argc, char* argv[])
{
  // пример первый:
  std::string s1="Я знаю русский!\n";
  std::cout << ToRus(s1);
 
  // пример второй:
  std::string s2=ToRus("Вторая строка\n");
  std::cout << s2;
 
  // пример третий:
  std::cout << ToRus("Третья строка\n");
  getch();
  return 0;
}если использовать string, то обязательно нужно подключать заголовочный файл <string>
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Егор (статус: 10-ый класс), 20 сентября 2009, 18:23 [#3]:вах, ошибка, однако  символы  "& lt;" следует читать как "<" ("меньше"), "& gt;" - как ">" ("больше"), а "& amp" - как "&" ("амперсанд")
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Ruslan (статус: 1-ый класс), 21 сентября 2009, 00:15 [#4]:работает однако ж! просто я изучаю С++ 3 дня
 скоро и до функций доберусь)
 спасибо большое!
 а почему вы не пользуетесь cтандартными cin cout
 а пользуетесь std::cin and std::cout
 ??
 |  
|   | Егор (статус: 10-ый класс), 21 сентября 2009, 06:23 [#5]:Согласно новым стандартам языка с++, потоки cout и cin "напрямую" недоступны. К ним можно получить доступ, подключившись к пространству имён std. Первый способ это сделать - в начале программы написать "using name std;" - но это плохой способ - так мы "вторгаемся" в чужое пространство имён. Второй способ - указывать пространство имён при использовании имён из этого пространства - std::cout, std::cin, std::endl, std::string и т.д. 
 Последние компиляторы (borland developer studio 2006 и выше, visual studio 2005 и позднее) требуют указания пространства имён, иначе ругаются на cout и cin как на неизвестные имена.
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Егор (статус: 10-ый класс), 21 сентября 2009, 06:29 [#6]:Согласно этим же новым правилам, стандартные заголовочные файлы (iosream, string) указываются в директиве include без расширения h: 
 #include <iostream>
#include <string> Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |