C++ 使用波兰语字符时文件内容被截断

C++ 使用波兰语字符时文件内容被截断,c++,file,character,ofstream,polish,C++,File,Character,Ofstream,Polish,代码: 文件内容与预期一致: 我认为,我国的风险管理部门在制定战略时应考虑到与奥斯扎科瓦尼亚的关系。 我认为,我国的风险管理部门在制定战略时应考虑到与奥斯扎科瓦尼亚的关系。 我认为,我国的风险管理部门在制定战略时应考虑到与奥斯扎科瓦尼亚的关系。 ... (剩下的97行都是这样) 更糟糕的是,当我使用同样的testArray(和波兰字符)在*.xls文件中写一些东西(使用libxl库)时,一切都正常 怎么了?如何将波兰语字母保存在文本文件中 编辑: 实际上,当我使用std::string和std:

代码:

文件内容与预期一致:

我认为,我国的风险管理部门在制定战略时应考虑到与奥斯扎科瓦尼亚的关系。
我认为,我国的风险管理部门在制定战略时应考虑到与奥斯扎科瓦尼亚的关系。
我认为,我国的风险管理部门在制定战略时应考虑到与奥斯扎科瓦尼亚的关系。
... (剩下的97行都是这样)

更糟糕的是,当我使用同样的
testArray
波兰字符)在*.xls文件中写一些东西(使用libxl库)时,一切都正常

怎么了?如何将波兰语字母保存在文本文件中

编辑: 实际上,当我使用
std::string
std::ofstream
(不宽)尝试相同的代码时,它也可以正常工作(使用波兰字母)。那么宽字符有什么问题呢?

已经有几十次了。但是,VisualStudio 2013中编写的C++控制台应用程序的下一个代码可以帮助:

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"
};
#包括Visual Studio添加的“stdafx.h”//
#包括
#包括
#包括
#包括
#包括
#包括
const std::locale utf8\u locale=std::locale(std::locale(),
新std::codevt_utf8());//为imbue调用准备参数
常量wchar_t*测试阵列[]=
{
L“Wszystkie kategorie równoważne”,
L“Oczekiwane przepływy pieniężne”,
L“风险i dojrzałość”,
L“Pozycja strategiczna i lata na rynku”,
L“奥萨科瓦尼亚的Prawdopobieństwo oszacowania”
};
void FaultyFunction(void)
{
_setmode(_fileno(stdout),_O_16text);//用于调试;如果省略,则
//std::wcout也将被截断
std::wofstream test_文件(“test.txt”);

//测试文件可能相关:生成的一行文件的文件大小是多少?@DrewDormann 27 bytes我让它在一个项目中工作,但在另一个项目中,我在
\u setmode(\u fileno(stdout),\u O\u 16text);
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"
};
#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;
}