Содержимое файла усекается при использовании польских символов

Код:

#include <fstream>

const wchar_t * testArray[] =
{
L"Wszystkie kategorie równoważne",
L"Oczekiwane przepływy pieniężne",
L"Risk i dojrzałość",
L"Pozycja strategiczna i lata na rynku",
L"Prawdopodobieństwo oszacowania"};

void FaultyFunction(void)
{
std::wofstream file("test.txt");
for (int i = 0 ; i < 100 ; ++i)
{
for (int j = 0 ; j < 5 ; ++j)
{
file << testArray[j] << L'\t';
}
file << L'\n';
}
}

int main(void)
{
FaultyFunction();
return 0;
}

«test.txt» после выполнения:

Wszystkie kategorie równowa

(Да, это весь файл!)

Теперь я не знаю, если это проблема с std::wofstream, кодировка файла или что, но результат, по крайней мере, странно. Но когда я убираю польские буквы:

const wchar_t * testArray[] =
{
L"Wszystkie kategorie rownowazne",
L"Oczekiwane przeplywy pieniezne",
L"Risk i dojrzalosc",
L"Pozycja strategiczna i lata na rynku",
L"Prawdopodobienstwo oszacowania"};

Содержимое файла соответствует ожидаемому:

Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk and dojrzalosc Pozycja Strategicna и Lata on rynku Prawdopodobienstwo oszacowania
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk and dojrzalosc Pozycja Strategicna и Lata on rynku Prawdopodobienstwo oszacowania
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk and dojrzalosc Pozycja Strategicna и Lata on rynku Prawdopodobienstwo oszacowania
… (это продолжается для остальных 97 строк)

И чтобы добавить оскорбление травмы, когда я использую то же самое testArray (с запишите некоторые вещи в файл * .xls (используя библиотеку libxl), все работает просто отлично.

В чем дело? Как сохранить польские буквы в текстовом файле?

Редактировать:
На самом деле, когда я попробовал тот же код, но с std::string а также std::ofstream (не широкий), он также работал нормально (с польские буквы). Так в чем же проблема с широкими буквами?

2

Решение

Обсуждались вопросы StackOverflow, MSDN, CodeGuru, CodeProject и т. Д. уже десятки раз. Однако следующий код для консольного приложения C ++, подготовленный в Visual Studio 2013, может помочь:

#include "stdafx.h"     // added by Visual Studio
#include <fstream>
#include <iostream>
#include <codecvt>
#include <locale>
#include <fcntl.h>
#include <io.h>

const std::locale utf8_locale = std::locale(std::locale(),
new std::codecvt_utf8<wchar_t>());      // prepare parameter for imbue call
const wchar_t* testArray[] =
{
L"Wszystkie kategorie równoważne",
L"Oczekiwane przepływy pieniężne",
L"Risk i dojrzałość",
L"Pozycja strategiczna i lata na rynku",
L"Prawdopodobieństwo oszacowania"};

void FaultyFunction(void)
{
_setmode(_fileno(stdout), _O_U16TEXT); // for debugging; if omitted then
// std::wcout would be truncated as well
std::wofstream test_file("test.txt");
// test_file << L"\xEF\xBB\xBF";     // Byte Order Mark: not required nor recommended
//       important: write BOM before imbue
test_file.imbue(utf8_locale);        // set the locale of the stream (and buffer
//       if any) to the specified locale
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < 5; ++j)
{
test_file << testArray[j] << L'\t';
// std::wcout << testArray[j] << L'\n';  // for debugging
}
test_file << L'\n';
}
}

int main(void)
{
FaultyFunction();
return 0;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]