С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408

Из текстового файла на консоль текст через широкую строку

01.02.2019, 16:44. Показов 2881. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Как правильно вывести текст на кириллице из файла в консольную строку с использованием wstring?

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>
#include <map>
#include <xstring>
#include <locale>
#include <fstream>
 
using namespace std;
 
int main()
{
    system("color 0A");
 
    wcout.imbue(locale("rus_rus.866"));
    wcin.imbue(locale("rus_rus.866"));
 
    wstring in;
    wifstream wfin;
    wfin.open("input.txt");
    wfin.imbue(locale("rus_rus.866"));
    getline(wfin, in);
    wfin.close();
    wcout << in << endl;
 
    system("pause");
    return 0;
}
Вывод не корректный.

Если же записывать из программы в файл, то:
При записи в файл и при открытии этого файла блокнотом - некорректное отражение.
NotePad++ корректно отображает содержание файла на кириллице.

Спасибо, кто поможет.
Миниатюры
Из текстового файла на консоль текст через широкую строку  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2019, 16:44
Ответы с готовыми решениями:

Как вывести строку из текстового файла на консоль?
подскажите как вывести строку из текстового файла на консоль

Как добаватить текст в последнюю строку текстового файла
пересмотрел много в Гугле, подскажите пожалуйста,как добавить текст в первую строку текстового файла,перед всем остальным текстом ...

Как вставить выводимый в результате выполнения команды DIR текст в заданную строку текстового файла?
Господа! ломаю голову, не могу перенести текст. Есть перечень имен файлов создаваемый командой dir. Есть сам файл txt в середину...

13
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 17:31
Цитата Сообщение от SomniPhobia Посмотреть сообщение
rus_rus.866
Вы путаете кодировку OEM866 c кодировкой ANSI

Вот файл с кодировкой OEM866 для вашей программы:
Вложения
Тип файла: rar input.rar (271 байт, 7 просмотров)
1
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 17:38
Если же вы хотите читать тот файл что уже есть у вас,
то замените
"rus_rus.866"
на
"rus_rus.1251"
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
01.02.2019, 18:09  [ТС]
XLAT, спасибо за ответ!
Цитата Сообщение от XLAT Посмотреть сообщение
Вот файл с кодировкой OEM866 для вашей программы
Да, открылся и прочитался корректно на 866.
Цитата Сообщение от XLAT Посмотреть сообщение
Если же вы хотите читать тот файл что уже есть у вас,
то замените
"rus_rus.866"
на
"rus_rus.1251"
Не помогло. Как сделать чтобы с моего файла тоже сработало?
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
01.02.2019, 18:11  [ТС]
Вот тот файл мой.
Вложения
Тип файла: zip my_input.zip (179 байт, 7 просмотров)
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 19:04
Лучший ответ Сообщение было отмечено SomniPhobia как решение

Решение

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Вот тот файл мой.
а это у вас utf-8


NotePad++ же у вас есть, он должен показывать в строке состояния, какая кодировка.

utf-8 не совместим с std::wstring,(как в новых студиях я не в курсе, скорее всего проблему там упростили)
нужно делать отдельную конвертацию вашего файла в широкий чар.

вот примерно, как делал я:
C++
1
2
3
4
    std::string str; //<<<---тут текст из вашего utf-8 файла
    int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);
    wchar_t *unicode_text = new wchar_t[len];
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, unicode_text, len);
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
01.02.2019, 19:06  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
а это у вас utf-8
NotePad++ же у вас есть, он должен показывать в строке состояния, какая кодировка.
Точно показывает. Спасибо!
Не надо ничего конвертировать. Я для себя пишу - тренируюсь.
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 19:21
Лучший ответ Сообщение было отмечено SomniPhobia как решение

Решение

Цитата Сообщение от SomniPhobia Посмотреть сообщение
ак сделать чтобы с моего файла тоже сработало?
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
31
///----------------------------------------------------------------------------|
#include <iostream>
#include <string>
#include <locale>
#include <fstream>
 
wchar_t* get_wstr(std::string& str)
{
    int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);
    wchar_t *unicode_text = new wchar_t[len];
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, unicode_text, len);
    return unicode_text;
}
 
///----------------------------------------------------------------------------|
int main()
{
    system("color 0A");
    std::locale::global(std::locale("Russian"));
 
    std::ifstream inStream("input.txt");
    std::string   inText;
    std::getline(inStream, inText,'\0');
 
    std::wstring ss(get_wstr(inText));
    std::wcout << ss << L"\n\n";
 
    system("pause");
    return 0;
}
///----------------------------------------------------------------------------|
это работает с вашим файлом.
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
01.02.2019, 19:22  [ТС]
XLAT, я записал файл output.txt в кодировке 1251.
Считывается так корректно и выводится на консоль.
C++
1
2
3
4
5
6
7
8
9
10
wcout.imbue(locale("rus_rus.866"));
    wcin.imbue(locale("rus_rus.866"));
 
    wstring in;
    wifstream wfin;
    wfin.open("output.txt");
    wfin.imbue(locale("rus_rus.1251"));
    getline(wfin, in);
    wfin.close();
    wcout << in << endl;
А так не корректный вывод на консоль. Почему?
C++
1
2
3
4
5
6
7
8
9
10
wcout.imbue(locale("rus_rus.1251"));
    wcin.imbue(locale("rus_rus.1251"));
 
    wstring in;
    wifstream wfin;
    wfin.open("output.txt");
    wfin.imbue(locale("rus_rus.1251"));
    getline(wfin, in);
    wfin.close();
    wcout << in << endl;
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 19:36
Цитата Сообщение от SomniPhobia Посмотреть сообщение
А так не корректный вывод на консоль. Почему?
oem866 это старая довиндовская, т.е. досовская(если вы помните что это) кодировка:
https://ru.wikipedia.org/wiki/CP866

а 1251(ANSI) это уже принесли вместе в виндой:
https://ru.wikipedia.org/wiki/Windows-1251

Например:
строчная буква «я» в 1251имеет код 0xFF
строчная буква «я» в 866 имеет код 0x9F
ну и соответственно, прога тока может догадываться(предполагать), что вы даете ей на вход.
если она ждет 866 а вы даете 1251, то будут кракозябры и наоборот.

Ну, а тут еще и utf-8 хотца....)
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
01.02.2019, 19:47  [ТС]
XLAT, тексты в кодировках с какими номерами корректно отображает консоль?
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 19:50
Цитата Сообщение от SomniPhobia Посмотреть сообщение
wcin.imbue(locale("rus_rus.1251"));
Цитата Сообщение от SomniPhobia Посмотреть сообщение
wcin.imbue(locale("rus_rus.866"));
судя по всему это не работает.

вот так же работает с 1251
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    system("color 0A");
    std::locale::global(std::locale("Russian"));
 
    wstring in;
    wifstream wfin;
    wfin.open("input.txt");
    getline(wfin, in);
    wfin.close();
    wcout << in << endl;
 
    system("pause");
    return 0;
}
Цитата Сообщение от SomniPhobia Посмотреть сообщение
XLAT, тексты в кодировках с какими номерами корректно отображает консоль?
родная вроде как раз это старая досовская кодировка,
но есть еще локаль))
это значит что ваш файл не будет читаться в Аргентине или Конго.
И вот ту, как раз и пригодится юникод, тот же utf-8
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
01.02.2019, 19:55  [ТС]
XLAT, поток пропитывается (imbue) кодировкой. А широкая строка не имеет кодировки, информации о ней, не пропитывается?

Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
вот так же работает с 1251
Да.

Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
std::locale::global(std::locale("Russian "));
Это кодировка с каким номером?
0
Just Do It!
 Аватар для XLAT
4201 / 2657 / 654
Регистрация: 23.09.2014
Сообщений: 8,958
Записей в блоге: 3
01.02.2019, 20:03
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Это кодировка с каким номером?
это локаль, в данном случае русская.
даже при наличии юникод-текста на компе юзера может не оказаться нужного нац.шрифта.
std::locale("Russian") как раз говорит системе что нужен русский шрифт.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2019, 20:03
Помогаю со студенческими работами здесь

Вывод из текстового файла в консоль
Здравствуйте, прошу о помощи! Задача: Создать консольную программу, которая будет считывать содержимое текстового файла в консоль. Для...

Консоль не читает строки из текстового файла
Добрый день! Консолька принимает на вход вопрос и ищет из текстового файла ответ, путем перебора ПРоблема в том, что при запуске -...

Чтение из текстового файла и вывод в консоль
Помогите пожалуйста, мне нужно чтобы из текстового файла в консоли выводился список людей, например 1 Иванов Иван Васильевич 2 Иванов...

Как вывести данные из текстового файла в консоль?
Обучаюсь по &quot;Хорстманн К. - Java. Библиотека профессионала. Том 1. Основы&quot; Глава 3. Раздел 3.7.3. &quot;Файловый ввод и вывод&quot; ...

Вывод текст в консоль (не получается вывести текст в консоль; попытка была в разделе menu, но вывелся ужас)
d_d1 segment ;начало сегмента данных m1 db 23, '=========MENU=========', 23, '$' m2 db 23, '| 1- slodjenie |', 23, '$' m3 db...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru