Консольный ввод-вывод.

Под Windows довольно часто возникают вопросы по поводу отображения русских букв в консоли . Вывод и ввод русских букв сопровождается выводом и вводом каких-то кракозябр или иероглифов. В интернете можно найти довольно много советов, но большая часть советов, которые мне попались, не помогали в решении проблемы.

Возникла проблема с отображением русских букв

Если нужно быстрое решение данной проблемы, то можно сразу пролистать вниз , ибо сначала я расскажу о том, как возникла эта проблема у меня и о том, как я искал решение.

На языке C++ программирую под ОС Linux, использую компилятор GCC. С проблемой неправильного отображения русских букв я не сталкивался. В момент написания статьи я нахожусь далеко от своего компьютера, могу довольствоваться лишь скромненьким ноутбуком с установленной ОС Windows Seven. Захотелось покодить и я установил на него интегрированную среду разработки Dev-C++ 5.10(использует компилятор TDM-GCC 4.8.1 на базе GCC 4.8.1). Кстати, она уже официально не поддерживается, но существует форк Orwell Dev-C++, который обновляется по сей день. Установив, я запустил и для пробы написал простую программку, которая отображает текст «Привет, мир!». Но поздороваться она с миром так и не смогла, а лишь сказала что-то непонятное на древнеегипетском. После перелопачивания некоторых форумов и сайтов я нашел множество советов, но основная масса не способна была решить её полностью, образовывались подводные камни о которых расскажу далее.

После написания, компиляции и запуска такой программы:

#include using namespace std; int main() { cout << "Привет, Мир!"; return 0; }

#include

using namespace std ;

int main ()

cout << ;

return 0 ;

Можно получить примерно такой результат

Сразу понятно, что на приветствие это совсем не похоже.

После прочтения кучи советов стало понятно, что большая часть советов предлагала решить проблему функцией setlocale() , которая находится в заголовочном файле .

Последовав совету и усовершенствовав программу таким образом:

#include #include //Обязательно для функции setlocale() using namespace std; int main() { setlocale(LC_ALL,"Russian"); //Функция setlocale() с аргументами cout << "Привет, Мир!"; return 0; }

Дополнительно : можно было написать setlocale(0, «») и результат был бы аналогичным, при условии, что в настройках ОС язык системы русский.

На вывод я получил следующий результат

Отлично, подумал я. Казалось бы, что проблема решена и программа здоровается на родном языке, но вот именно здесь оказались подводные камни.

О них я узнал из обсуждения. У человека была аналогичная проблема, решенная таким образом. Но решение удовлетворяло его недолго, он сообщил, что программа при вводе данных и последующем их выводе не выводит на руском, она говорит на непонятном языке.

Коль уж так, я решил вновь внести изменения в программу, пусть она поздоровается со мной по имени.

#include #include using namespace std; int main() { setlocale(LC_ALL,"Russian"); char name; cout << "Введите своё имя: "; cin >> name; //Ввод данных cout << "Привет, " << name; return 0; }

#include

#include

using namespace std ;

int main ()

setlocale (LC_ALL , "Russian" ) ;

char name [ 12 ] ;

cout << "Введите своё имя: " ;

cin >> name ; //Ввод данных

cout << "Привет, " << name ;

return 0 ;

Но в результате я получил не приветствие

Как видно, она не смогла назвать моего имени.

Поискав информацию в сети, я узнал о том, что setlocale() не работает с потокоми ввода/вывода , а то есть с cin,cout,etc. Выходит, что нужно искать альтернативные способы решения данной проблемы, которые предлагались на других сайтах.

Решение проблемы с отображением русских букв в консоли

По-другому решить проблему можно было воспользовавшись функциями SetConsoleCP() и SetConsoleOutputCP() с аргуменом 1251 в обеих. Эти функции требуют подключения заголовка , практически в каждом компиляторе под Windows он имеется, проблем не будет.

Усовершенствовал программу таким образом

#include #include // Обязательно для SetConsoleCP() и SetConsoleOutputCP() using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); char name; cout << "Введите свое имя: "; cin >> name; cout << "Привет, " << name; return 0; }

На вывод получил

Снова что-то непонятное. Но решение, как оказалось, находилось очень близко. У функций SetConsoleCP() и SetConsoleOutputCP() есть небольшой недостаток — они работают только со шрифтом Lucida Console. В консоли же по умолчанию стоит шрифт Consolas, либо точечные шрифты. Следующим этапом сделать нужно вот что. Находясь в консоли нажать кнопку Cmd или нажать на значек программы в левом верхнем углу(Перед D:\… в названии), то есть вызвать контекстное меню окна. Далее нажать «Свойства».

И нажать на кнопку ОК.

После такой процедуры я вновь запустил программу и…

Да! Она поздоровалась со мной по имени на русском языке.

Данный способ помог решить мне проблему с отображением русских символов в консоли Windows , надеюсь, что кому-нибудь еще он тоже поможет. Спасибо за внимание.

Для вас это может быть интересно:

Ввод/вывод информации в языке C осуществляется с помощью функций, объявленных в заголовочных файлах. Простейший способ воспользоваться функцией – написать обращение к этой функции. Основные функции ввода/вывода задаются в заголовочном файле stdio.h. printf() – консольный вывод

scanf() – консольный ввод.

Структура обращения к функции:

printf ("строка формата", арг1, арг2, …, аргN);

В качестве аргументов функции арг1…аргN

используются идентификаторы переменных или выражения. Список аргументов может быть пустым. Строка формата записывается в двойных кавычках и может содержать:

любой текст; спецификаторы форматов (по количеству аргументов), обозначаются символом %, содержат информацию о типе выводимого значения и его модификации; управляющие символы. Напомним, что управляющий символ, или ESC-последовательность , формируется из символа обратной наклонной черты «\», называемого в языке C escape-символом, и латинской буквы.

Синтаксис обращения к функции:

scanf("строка формата", список аргументов);

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

Особенности функции:

список аргументов может состоять из одного или нескольких аргументов; разделителем в списке аргументов служит [,];

в качестве аргументов функции используются только адреса переменных.

Задачей аргумента в данной функции является указание адреса ячейки памяти, куда должно быть помещено вводимое значение. Так, символ & обозначает операцию получения адреса переменной, т. е. конструкция &p обеспечивает ввод значения в ячейку памяти, где размещена переменная p. При использовании функции scanf() необходимо помнить два правила:

при считывании значений для переменных простого типа перед именем переменной ставится символ &;

при считывании строки символ & не ставится, так как строковая переменная задается с помощью указателя.

61. Файловый ввод/вывод данных в языке Си.

Чтение из потока

при помощи fgetc

Функция fgetc применяется для чтения символа из потока.

int fgetc(FILE *fp);

В случае успеха, fgetc возвращает следующий байт или символ из потока (зависит от того, файл «двоичный» или «текстовый»). В противном случае, fgetc возвращает EOF. (Отдельный тип ошибок можно определить вызовом ferror или feof с указателем на файл.)

Стандартный макрос getc также определен в , успешно работая как fgetc, кроме одного: будучи макросом, он может обрабатывать свои аргументы более одного раза.

Стандартная функция getchar также определена в , она не принимает аргументов, и эквивалентна getc(stdin) при помощи fgets. Функция fgets применяется для чтения строки из потока. Считывание происходит до тех пор пока не будет достигнут конец строки или длина строки, в которую происходит считывание.

fwrite определяется как

int fwrite (const char * array, size_t size, size_t count, FILE * stream); Функция fwrite записывает блок данных в поток . Таким образом запишется массив элементов

array в текущую позицию в потоке. Для каждого элемента запишется size байт. Индикатор позиции в потоке изменится на число байт, записанных успешно. Возвращаемое значение будет равно count в случае успешного завершения записи. В случае ошибки возвращаемое значение будет меньше count.

Функция fputc применяется для записи символа в поток.

int fputc(int c, FILE *fp);

Параметр fputc конвертируется в unsigned char перед выводом. Если прошло успешно, то fputc возвращает записанный символ. Если ошибка, то fputc возвращает EOF.

Стандартный макрос putc также определен в , работая в общем случае аналогично fputc, за исключением того, что будучи макросом, он может обрабатывать свои аргументы более одного раза.

Стандартная функция putchar, также определенная в , принимает только первый аргумент, и является эквивалентной putc(c , stdout), где c является упомянутым аргументом.

Последнее обновление: 20.07.2018

Консольный вывод

Для вывода информации на консоль мы уже использовали встроенный метод Console.WriteLine . То есть, если мы хотим вывести некоторую информацию на консоль, то нам надо передать ее в метод Console.WriteLine:

Using System; namespace HelloApp { class Program { static void Main(string args) { string hello = "Привет мир"; Console.WriteLine(hello); Console.WriteLine("Добро пожаловать в C#!"); Console.WriteLine("Пока мир..."); Console.WriteLine(24.5); Console.ReadKey(); } } }

Консольный вывод:

Привет мир! Добро пожаловать в C#! Пока мир... 24,5

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

Using System; namespace HelloApp { class Program { static void Main(string args) { string name = "Tom"; int age = 34; double height = 1.7; Console.WriteLine($"Имя: {name} Возраст: {age} Рост: {height}м"); Console.ReadKey(); } } }

Для встраивания отдельных значений в выводимую на консоль строку используются фигурные скобки, в которые заключается встраиваемое значение. Это можем значение переменной ({name}) или более сложное выражение (например, операция сложения {4 + 7}). А перед всей строкой ставится знак доллара $.

При выводе на консоль вместо помещенных в фигурные скобки выражений будут выводиться их значения:

Имя: Tom Возраст: 34 Рост: 1,7м

Есть другой способ вывода на консоль сразу нескольких значений:

Using System; namespace HelloApp { class Program { static void Main(string args) { string name = "Tom"; int age = 34; double height = 1.7; Console.WriteLine("Имя: {0} Возраст: {2} Рост: {1}м", name, height, age); Console.ReadKey(); } } }

Этот способ подразумевает, что первый параметр в методе Console.WriteLine представляет выводимую строку ("Имя: {0} Возраст: {2} Рост: {1}м"). Все последующие параметры представляют значения, которые могут быть встроенны в эту строку (name, height, age). При этом важен порядок подобных параметров. Например, в данном случае вначале идет name, потом height и потом age. Поэтому у name будет представлять параметр с номером 0 (нумерация начинается с нуля), height имеет номер 1, а age - номер 2. Поэтому в строке "Имя: {0} Возраст: {2} Рост: {1}м" на место плейсхолдеров {0}, {2}, {1} будут вставляться значения соответствующих параметров.

Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не осуществляет переход на следующую строку.

Консольный ввод

Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.

Using System; namespace HelloApp { class Program { static void Main(string args) { Console.Write("Введите свое имя: "); string name = Console.ReadLine(); Console.WriteLine($"Привет {name}"); Console.ReadKey(); } } }

В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine передается в переменную name.

Пример работы программы:

Введите свое имя: Том Привет Том

Таким образом мы можем вводить информацию через консоль. Однако минусом этого метода является то, что Console.ReadLine считывает информацию именно в виде строки. Поэтому мы можем по умолчанию присвоить ее только переменной типа string. Как нам быть, если, допустим, мы хотим ввести возраст в переменную типа int или другую информацию в переменные типа double или decimal? По умолчанию платформа.NET предоставляет ряд методов, которые позволяют преобразовать различные значения к типам int, double и т.д. Некоторые из этих методов:

    Convert.ToInt32() (преобразует к типу int)

    Convert.ToDouble() (преобразует к типу double)

    Convert.ToDecimal() (преобразует к типу decimal)

Пример ввода значений:

Using System; namespace HelloApp { class Program { static void Main(string args) { Console.Write("Введите имя: "); string name = Console.ReadLine(); Console.Write("Введите возраст: "); int age = Convert.ToInt32(Console.ReadLine()); Console.Write("Введите рост: "); double height = Convert.ToDouble(Console.ReadLine()); Console.Write("Введите размер зарплаты: "); decimal salary = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine($"Имя: {name} Возраст: {age} Рост: {height}м Зарплата: {salary}$"); Console.ReadKey(); } } }

При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания...), в других - запятая (Россия, Германия...). Например, если текущая ОС - русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.

Пример работы программы:

Введите имя: Том Введите возраст: 25 Введите рост: 1,75 Введите размер зарплаты: 300,67 Имя: Том Возраст: 25 Рост: 1,75м Зарплата: 300,67$

Всем моё си плюс-плюсное здрасьте! Сегодня моя речь пойдет о некоторых полезных функциях языка c++. Когда меня в институте начали учить этому языку программирование я удивился его простоте и возможностям! Но проходили мы только функции, необходимые для написания простеньких консольных приложений. И меня однажды пропёрло покрасить текст и фон в консоли, но учитель забыл их.

Но говорил, что такие функции существуют и не мало! Ну, ясно, что я сразу полез искать в Интернете. И естественно там я ничего не поFINDил. И я уже совсем расстроился, как случилось чудо!!! На уроке информатики, где мы изучали MS Word и DOS , заскучал и полез искать хлам на винте. И случайно увидел какие-то исходники…

Ну естественно я их начал читать. и Тогда я увидел, что есть умные люди в универе, они вручную перевели из Ansi в OEM кодировку и засунули в исходник текст, что позволило работать с русскими словами в с++ и выводить русские буквы в консоль (Об этом позже.). Я подумал "Алелуя! Здесь есть умные люди". И радости моей не было пределе, а того чувака я так и не нашёл:(. Но, запустив этот исходник в билдере я уж посильнее удивился. Он покрасил текст и фон в консольном приложении. Ну, блин, я сразу взялся всё переписывать в тетрадь. И вот теперь я доношу эту инфу до вас!

Текст покрасить можно разными цветами и делаем это так:

#include
#include //Необходимые библиотеки

// В справке указано только КОНИО, но так у меня не работает.
// Ширина экрана (в символах) в DOS всегда 80 (а высота - 25 строк).

textbackground(GREEN); //Цвет фона.
textcolor(RED); //Цвет текста.
clrscr(); //Очищаем экран (Не обязательно!)

Вот привожу таблицу цветов:

BLACK 0
BLUE 1
GREEN 2
CYAN 3
RED 4
MAGENTA 5 //Цвета писать в верхнем регистре а команды в нижнем.
BROWN 6
LIGHTGRAY 7
DARKGRAY 8
LIGHTBLUE 9
LIGHTGREEN 10
LIGHTCYAN 11
LIGHTRED 12
LIGHTMAGENTA 13
YELLOW 14
WHITE 15

BLINK 128

С английским разбирайся сам.
Можно юзать эту функцию со смесью цветов:

textcolor(CYAN + BLINK);

С этой функцией я долбался очень долго!

Теперь перейдем к следующей функции: WINDOW
Она позволяет, как окрасить нужную часть экрана, так и позволить вводить там текст, подобно gotoxy(); или (LOCATE - В бейсике).
Эту функцию нужно юзать с теми же библиотеками, что и textcolor.

clrscr();
textbackground(GREEN);
textcolor(RED);
window(30,10,50,10); //Вот и она.
clrscr();

Результат работы этого сыра смотри сам! И поймешь!
Вот тебе вырезка из справки Билдера

Прототип
void window(int left, int top, int right, int bottom);

С английскими словами проблем быть не должно!

Если window не использовать, то она равна по умолчанию первой строке и первому столбцу.

Эти функции можно использовать несколько раз в программе:

#include
#include
#include
int main()
{ float z,;
clrscr();
textbackground(GREEN);
textcolor(RED); //Тут меняем как надо.
window(30,10,50,10); //Положение экрана!
clrscr();
cout<<"\Hello World!";
getch();
textbackground(BLACK);
textcolor(LIGHTGRAY); //Все возвращаем обратно. По умолчанию так и есть.
clrscr();
}

Теперь ляпну про генератор случайных чисел:
Его юзать вот так:

randomize();
a = rand()/3276 //В a сгенерится любое число от 0 до 9.
a=random(50); //Или вот так число от 0 до 49.

Часто без использования "randomize();" генератор генерит все одинаковые числа!
А с ним все проще он всегда разные числа генерирует.

Всякие прикольные утилиты тоже пригодятся. Например
Cout<<"/n"; можно заменить вот так cout<

Функция gotoxy(1,44) - отправляет курсор, который мигает в точку окна строки 1 ,столбца 44.
Подключив #include math.h мы можем считать различные математические функции:

A = pow(A,4) - возводим A в 4 степень.
A = sqrt(A) - Получаем квадратный корень из A;
A = tan, sin, cos, exp, exp2, ctan, ant - всякие тангенсы экспоненты!

Если набираем символы для вывода в консоль:
Cout << "/t/n";
Есть много нюансов.

/t - Табуляция.
/a - Звуковой сигнал.
/v
/f
/x - Разберись с ними сам, а проще попробуй все:.

Также чтоб вывеси "/" нужно писать:

Cout<<"//";
А ":
Cout<<"/"";

Вот так вот.
Функция getch(); ждет символа с клавиатуры! Полезна в конце программ, чтобы не закрылось окно.
Функций еще очень много, хочешь знать больше?? Жми F1



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: