Studio: читаем файл в кодировке Юникода UTF-8
В этой заметке мы прочитаем текстовый файл из консольного приложения Visual Studio 2019 на C++ посимвольно и целиком.
Везде предполагается, что читаем из текущей папки, при запуске приложения из среды в режиме отладки это будет та же папка, где помещается файл с текстом программы, при отдельном запуске исполняемого exe-файла, соответственно, его папка. Файл с именем input.txt
имеет произвольное содержимое, но сохранён в кодировке Юникода UTF-8.
1. Читаем файл посимвольно. Учитывая, что полноценной поддержки Юникода в консоли Visual C++ нет, получится так:
#include <iostream> #include <cstdio> #include <cstdlib> #include <clocale> #include <wchar.h> #include <io.h> #include <fcntl.h> int main () { char *locale = setlocale(LC_ALL, "ru_RU.utf8"); //русская локаль для Юникода _setmode(_fileno(stdout), _O_U16TEXT); //Ставим режим консоли FILE *in; fopen_s (&in,"input.txt", "r"); //Studio считает fopen устаревшей wint_t c; while ((c = fgetwc(in)) != WEOF) { wprintf(L"%c", c); //или: putwchar(c); } fclose(in); return EXIT_SUCCESS; }
2. Читаем этот же файл целиком.
#include <iostream> #include <sstream> #include <fstream> #include <codecvt> #include <io.h> #include <fcntl.h> int main () { _setmode(_fileno(stdout), _O_U16TEXT); std::wifstream infile("input.txt"); if (infile) { infile.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>)); std::wstringstream wss; wss << infile.rdbuf(); std::wcout << wss.str(); } infile.close(); return 0; }
Сам файл находился в одной папке решения с файлом исходного текста main.cpp
:
файл в папке и его содержимое
09.11.2020, 13:54 [1301 просмотр]