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

Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP() - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дано двумерный массив целых чисел. Все нечетные элементы заданного массива заменить суммой номеров их строки и столбца http://www.cyberforum.ru/cpp-beginners/thread907371.html
решил задачу думаю правильно все сделал. Если есть гдето ошибка скажитьте)))) #include<iostream> #include <conio.h> #include <cmath> #include <iomanip> #include <time.h> using namespace...
C++ run-time check failure #3-не запускаеться программулька Простая программка, проверяю-правельная. У друзей-работает, а у меня выдает "run-time check failure #3 the variable 'c' is being used without being initialized" Что может быть это? Вижуал Студию... http://www.cyberforum.ru/cpp-beginners/thread907370.html
C++ дописать ( Из массива А удалить все элементы, которые встречаются в В ровно 2 раза. Из В переписать в С те элементы, которые совпадают с оставшимися)
нужно чтоб на экран еще выводило перед новым массивом А, числа,которые повторяются в массиве В 2 раза. и перед С тоже чтоб выводило на экран числа,которые остались в старом массиве А. само задание...
C++ Поменять местами столбцы матрицы
условие : В матрице из действительных чисел поменять местами последний столбец со столбцом, содержащим наибольшее по абсолютной величине элемент матрицы. #include <iostream> #include <stdio.h>...
C++ Перевод из Delphi в С++ http://www.cyberforum.ru/cpp-beginners/thread907318.html
Приветствую. Нужно перевести по указанному в названии темы направлении код. Премного благодарен! type TMyStrArr = array of string; function GetWordsBy1stWord(str: string):...
C++ [Linker error] undefined reference to #include<string.h> #include<stdlib.h> #include<conio.h> #include<stdio.h> #include <math.h> #include<fstream> #include<iostream> using namespace std; подробнее

Показать сообщение отдельно
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115

Различие функций setlocale() и SetConsoleCP()/SetConsoleOutputCP() - C++

20.06.2013, 01:58. Просмотров 10456. Ответов 5
Метки (Все метки)

Вопрос состоит в следующем... Можно проверить с помощью функций GetACP(), GetOEMCP(), GetConsoleCP(), GetConsoleOutputCP(), что функция setlocale НЕ МЕНЯЕТ НИКАКИХ КОДИРОВОК в потоках ввода/вывода. Однако, если использовать функцию SetConsoleOutputCP(1251) или SetConsoleCP(1251), то после них setlocale() не работает! Особенно удивительно относительно функции SetConsoleCP(1251), она то здесь при чем?!!! Она отвечает только за ввод, но не вывод символов на экран, поэтому портить, по идее, ничего не должна! ?

листинг - 1

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>
using namespace std;
 
main()
{
//SetConsoleCP(1251);                //пока отключили
//SetConsoleOutputCP(1251);       //пока отключили
    setlocale(LC_ALL,"Rus");          //Устанавливаем кодировку???
                                
    cout<<GetACP()<<endl;                     //будет - 1251
    cout<<GetOEMCP()<<endl;                 //будет - 866
    cout<<GetConsoleCP()<<endl;            //будет - 866
    cout<<GetConsoleOutputCP()<<endl;   //будет - 866
    
    cout<<"Однако, выводим русские буквы"<<endl;
    cin.get();
}
листинг - 2

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>
using namespace std;
 
main()
{
   SetConsoleCP(1251);                  //ВКЛЮЧИЛИ
//SetConsoleOutputCP(1251);       //пока отключили
    setlocale(LC_ALL,"Rus");          //Устанавливаем кодировку???
                                
    cout<<GetACP()<<endl;
    cout<<GetOEMCP()<<endl;
    cout<<GetConsoleCP()<<endl;                     //поменялась
    cout<<GetConsoleOutputCP()<<endl;  
    
    cout<<"Получили крокозябры, хотя в ВЫВОДЕ на консоль НИЧЕГО не меняли"<<endl;
    cin.get();
}
листинг-3

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>
using namespace std;
 
main()
{
    //SetConsoleCP(1251);                //пока отключили
      SetConsoleOutputCP(1251);         //ВКЛЮЧИЛИ
      setlocale(LC_ALL,"Rus");          //Устанавливаем кодировку???
                                
    cout<<GetACP()<<endl;
    cout<<GetOEMCP()<<endl;
    cout<<GetConsoleCP()<<endl;                
    cout<<GetConsoleOutputCP()<<endl;    //поменялась
    
    cout<<"Опять получили крокозябры, хотя в ВЫВОДЕ на консоль русская кодировка 1251"<<endl;
    cin.get();
}
Но вот если использовать SetConsoleOutputCP(866) или SetConsoleCP(866), то все работает нормально... Почему? Получается, если просто использовать SetConsoleOutputCP(1251) или SetConsoleCP(1251), то указываем русскую кодировку, а если setlocale, то кодировка консоли - и вывода, и что удивительно, даже ВВОДА, должно быть CP866.
Во-первых, почему CP866? Во-вторых, при чем тут функция изменения ввода SetConsoleCP(866), если мы ничего не вводим?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru