58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
1

Потоки ввода/вывода

10.10.2020, 00:04. Показов 1811. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Заметил такую штуку, что если
C++
1
2
char name[] = "Тимур";
cout << name << endl;
то в консоли иероглифы ╥шьєЁ.
А если так
C++
1
2
3
char name[50];
cin << name; // ввожу Тимур
cout << name << endl; // выводит сразу на русском
В обоих примерах не использовал
C++
1
setlocale(LC_ALL, Russian);
Почему так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2020, 00:04
Ответы с готовыми решениями:

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода,...

Потоки ввода-вывода
1) Типы данных, для которых перегружены операторы форматного ввода-вывода.

Потоки ввода-вывода в С++
Ребят, нужна помощь В программирование я новичок, но сдать нужно 1. Написать программу,...

Потоки ввода вывода
Почему с помощью классов ostream и istream нельзя создавать свои потоки ввода вывода? std::ostream...

15
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
10.10.2020, 07:29 2
Потому что в первом случае файл надо сохранить в кодировке oem866:
для студии: File->Save [projectName].cpp As->Save->Save with Encoding->Cyrillic(DOS) - Codepage 866->OK
Миниатюры
Потоки ввода/вывода  
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
10.10.2020, 09:02 3
Цитата Сообщение от Timurs Посмотреть сообщение
char name[] = "Тимур";
cout << name << endl;
то в консоли иероглифы ╥шьєЁ.
давно ведь известно, что кириллица только в wchar, а не в char
даже при смене локали (по сути то же, что ответ #2) - у меня норм вывод только wchar и только при смене локали (или смене кодировки файла, как в #2)
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 <iostream>
 
using namespace std;
 
int main(int argc, const char *argv[])
{
    char name[] = "Тимур";
    cout << name << endl;
    
    setlocale(LC_CTYPE, ".866");    //  не работает
    const char* A[3] = { "КИБЕР", "форум", "инфо" };
    cout << A[0] << endl;
    
    setlocale(LC_CTYPE, ".866");    //  работает
    wcout << L"\n1. Создание списка сотрудников:\n" << endl;
 
    wchar_t ch = L'и';
    wchar_t s[] = L"вывод!";
    wstring ws = L"привет, мир!";
    
    wcout << ch << endl;
    wcout << s << endl;
    wcout << ws << endl;
 
    return 0;
}
на вопрос Почему - думаю, дело в том, что UTF-16 в ОС Windows​ (aka DWORD в 32х), а в Unix (на котором и в консоли)- UTF-8 - по сути 1_байт unix'а против 2_байт windows... поэтому задав char'овый array [50] - вы имеете запас места разместить ваше слово (по сути 5*2 машинных знаков слов) в заданный контейнер... когда же вы задаёте [] - то КОД делает размер вашего char'ового array строго на 5 символов "Тимур", чего мало для того чтобы впихнуть UTF16 (windows'ский) в UTF8(UNIX'ный)... чтобы было норм и существует расширенный Unicode - wchar... ну и setlocale помогает...
объяснила, как смогла - по логике - за подробностями - вам надо вникать в тему кодировок и "машинных слов" - например, у Касперского...

Добавлено через 8 минут
хоть - код ниже тоже работает
C++
1
2
3
    char name0[5];
    cin >> name0; // ввожу Тимур
    cout << name0 << endl; // выводит сразу на русском
думаю, тут просто name0 с cin подгоняется под нужный размер с ввода, а не с начальной декларации/инициализации...

Добавлено через 17 минут
да и уровень C/C++ всё равно выше, чем уровень самого процессора... поэтому на более высоком уровне - др. "библиотека" отвечает за нормальное представление того, что процессор читает как (16-бит * 2 = DWORD) в ОС Windows 32x... за это отвечает wchar в С/С++
0
58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
10.10.2020, 15:10  [ТС] 4
igorrr37, JeyCi, я имел ввиду не почему кракозябры выводятся, а почему при заполнении переменной name через cin на экран всё как надо выводится, хотя в обоих случаях код вывода один и тот же
C++
1
cout << name << endl;
Цитата Сообщение от JeyCi Посмотреть сообщение
поэтому задав char'овый array [50] - вы имеете запас места разместить ваше слово
Это на правду не похоже, я проверял длину слова через strlen()

JeyCi,
Цитата Сообщение от JeyCi Посмотреть сообщение
когда же вы задаёте [] - то КОД делает размер вашего char'ового array строго на 5 символов "Тимур", чего мало для того чтобы впихнуть UTF16 (windows'ский) в UTF8(UNIX'ный)...
Это не так, вот код
C++
1
2
3
4
char s1[6], s2[3];
cin >> s1 >> s2;
cout << endl << "s1: " << s1 << " " << strlen(s1) << " s2: " << s2 << " " << strlen(s2) << endl;
cout << endl;
вот вывод
Код
Привет мир

s1: Привет 6 s2: мир 3
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
10.10.2020, 15:18 5
Цитата Сообщение от JeyCi Посмотреть сообщение
давно ведь известно, что кириллица только в wchar, а не в char
это зависит от кодировки. в кодировках CP866 и CP1251 есть кириллица. при этом эти кодировки однобайтовые(точнее 8-и битные), так что их можно хранить в char и в std::string, соответственно.
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
10.10.2020, 15:28 6
Цитата Сообщение от Timurs Посмотреть сообщение
Это не так, вот код
описала ведь и эту ситуацию (после объяснений) - cin (даже синим выделила)...
вы не поймёте, как С/С++ работает с символами, если не понимаете, как процессор работает с битами... язык не перепрыгнет машинную трактовку... если в нём это не заложено, в метод cin, видимо, заложено... добавить нечего, кроме "читайте внимательнее ответы" - за доп инфо туда же - к Касперскому...

Добавлено через 5 минут
Цитата Сообщение от GbaLog- Посмотреть сообщение
это зависит от кодировки. в кодировках CP866 и CP1251 есть кириллица. при этом эти кодировки однобайтовые(точнее 8-и битные), так что их можно хранить в char и в std::string, соответственно.
но кодировка windows по умолчанию 2-байтовая - utf16... поэтому и приходится менять...
от Framework'a тоже зависит - Qt полностью перешёл на utf8, U++ у меня норм рус яз только с wchar... иначе даже setlocale не помогает (по коду выше отразила, код писала в U++)
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
10.10.2020, 15:50 7
del

Добавлено через 17 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
но кодировка windows по умолчанию 2-байтовая - utf16.
это wchar_t.
я же говорю про однобайтовые кодировки.
если сохранить исходник с русским текстом в CP866 и потом запустить в консоли, которая поддерживает CP866, то выведется кириллица.
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
10.10.2020, 15:53 8
Цитата Сообщение от GbaLog- Посмотреть сообщение
если сохранить исходник с русским текстом в CP866 и потом запустить в консоли, которая поддерживает CP866,
а это и никто не отрицал...
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
10.10.2020, 15:57 9
Цитата Сообщение от JeyCi Посмотреть сообщение
а это и никто не отрицал...
а это что?..
Цитата Сообщение от JeyCi Посмотреть сообщение
давно ведь известно, что кириллица только в wchar, а не в char
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
10.10.2020, 16:24 10
я вижу, что коты читать не умеют...
не надо подменять цитаты из разных постов на каждое слово "это"...
кодировка файла и символы языка - это разные вещи... w - давно известно что widen... что значит "расширенный" - в google...

Добавлено через 15 минут

Не по теме:

только вышла из Deadlock'a... подобрела... но всё равно не люблю, когда с видом гуру смешивают понятия и цитаты, и возомнят, что они что-то доказали...

0
58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
10.10.2020, 17:02  [ТС] 11
JeyCi,
тут просто name0 с cin подгоняется под нужный размер с ввода, а не с начальной декларации/инициализации...
описала ведь и эту ситуацию (после объяснений) - cin (даже синим выделила)...

C++
1
2
3
4
char s1[6], s2[3];
cin >> s1 >> s2;
cout << endl << "s1: " << s1 << " " << strlen(s1) << " s2: " << s2 << " " << strlen(s2) << endl;
cout << endl;
Ничего не подогналось
Код
Привет мир

s1: Привет 6 s2: мир 3
В слове привет 6 символов, я вывожу длину этой строки, на выходе 6. Думаю, что это можно трактовать, что переменная s1 в данном случае весит 6 байтов размерность на 6 установлена). Аналогично с переменной s2. Тут ведь нет wchar, тип данных переменной s1 чар.

p. s. слово и двойное слово это сколько в битах? 8 и 16?
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
10.10.2020, 17:29 12
Цитата Сообщение от Timurs Посмотреть сообщение
p. s. слово и двойное слово это сколько в битах? 8 и 16?
Цитата Сообщение от JeyCi Посмотреть сообщение
за подробностями - вам надо вникать в тему кодировок и "машинных слов" - например, у Касперского...
Цитата Сообщение от JeyCi Посмотреть сообщение
кодировка файла и символы языка - это разные вещи...
выхожу из гнилого диалога - откровенно не =т времени - чтобы вы мне своими cin с пеной у рта доказывали, что читать не умеете... где язык программирования, а где процессор, а где кодировка файла?..(мне даже отвечать не надо)
остальное у Касперского...
действительно, нет времени
0
58 / 48 / 14
Регистрация: 23.02.2016
Сообщений: 433
10.10.2020, 17:43  [ТС] 13
JeyCi, ну я не доказываю и сам cin крайне редко использую, да и в голову бы не пришло кириллицу ввести в таком случае. Просто задачи из книги делаю на базовые типы данных, и там чёрным по белому написано, что будет в переменных s1 и s2 если ввести "Джордж спешит!"
cin >> s1 >> s2;
Мне даже было лень это кодить ибо вроде очевидно, что ничего там вразумительного не будет. Но оказалось, что всё хорошо. Пробелы поток глушит, это понял, а вот какого он кириллицу выводит не понял. Посмотрю у Касперского. Также понимаю, что слово на разных процах занимает разное количество битов, имел ввиду стандартную 32ух битовую архитектуру x86. Пусть он даже правильно выводит на кириллице, но это не изменит того, что выделено 6 байтов на строку и реально не понятно как можно в 6 байтов вместить что-то большее, выше писали, что вчар символ весит как чар, отсюда предположу что в переменной будут лежать вчар символы хоть она и объявлена как чар.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.10.2020, 17:48 14
Лучший ответ Сообщение было отмечено Timurs как решение

Решение

Цитата Сообщение от Timurs Посмотреть сообщение
Почему так?
ни почему.
так как это:
Цитата Сообщение от Timurs Посмотреть сообщение
cin << name; // ввожу Тимур
не будет работать.

Цитата Сообщение от Timurs Посмотреть сообщение
почему при заполнении переменной name через cin на экран всё как надо выводится
cin/cout работают в соответствии с настройками заданной для них локали.
локаль отвечает за кодировку.

в твоём случае у cin и cout выставлена одинаковая локаль (по умолчанию - системная)
поэтому данные взятые из cin корректно отображаются при помощи cout

а вот здесь:
Цитата Сообщение от Timurs Посмотреть сообщение
char name[] = "Тимур";
cout << name << endl;
данные закодированны в соответствии с кодировкой исходного файла.
и эта кодировка может быть не совместима с локалью cout

Цитата Сообщение от GbaLog- Посмотреть сообщение
а это что?..
Цитата Сообщение от JeyCi Посмотреть сообщение
давно ведь известно, что кириллица только в wchar, а не в char
"это" - каша в голове.

девочка не понимает, что такое "киррилица", и как кодировка связанна с байтами.
1
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
10.10.2020, 18:20 15
Цитата Сообщение от hoggy Посмотреть сообщение
девочка не понимает,
мальчик считать не умеет - не дорос ещё...
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
02.06.2021, 12:05 16
в U++ IO ещё проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <Core/Core.h>
 
using namespace Upp;
 
CONSOLE_APP_MAIN
{
    StdLogSetup(LOG_COUT|LOG_FILE);
    SetLanguage( LNG_('R','U','R','U') );
    
    String s="один";
    LOG(s);     // LOG OK
    
    const char* text_char = s;
    WString w=WString(text_char);
    LOG(w);     // LOG OK
}
0
02.06.2021, 12:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2021, 12:05
Помогаю со студенческими работами здесь

Потоки вывода/ввода
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { cout &lt;&lt; &quot;Enter...

Потоки ввода/вывода
Здравствуйте! Расскажите мне пожалуйста подробнее о всех особенностях потоков ввода/вывода; в...

Потоки ввода-вывода fsstream
Киберпрогеры, всем привет Сейчас осваиваю потоки ввода-вывода fstream. Столкнулся с проблемой в...

Используя потоки ввода/вывода в С++
Здравствуйте помогите организовать запись информации из массива объектов в класс, чтение данной...

ФАЙЛОВЫЕ ПОТОКИ ВВОДА-ВЫВОДА
Дан файл вещественных чисел a.txt Найти количество отрицательных и количество положительных...

Текстовые файлы и потоки ввода/вывода
Доброго времени суток. Уважаемый гуру, не могли бы вы мне помочь с решением данной программы....


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru