使用波兰字符时,文件内容被截断 [英] File content truncated when using polish characters

查看:246
本文介绍了使用波兰字符时,文件内容被截断的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

代码:

  #include< fstream> 

const wchar_t * testArray [] =
{
LWszystkie kategorierównoważne,
LOczekiwaneprzepływypieniężne,
LRisk i dojrzałość,
LPozycja strategiczna i lata na rynku,
LPrawdopodobieństwooszacowania
};

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';
}
文件<< L'\\\
';
}
}

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

test.txt:


Wszystkie kategorierównowa


(是的,整个文件! / p>

现在,我不知道这是一个问题与 std :: wofstream ,文件编码,结果是至少奇怪。但是当我删除波兰语字母:

  const wchar_t * testArray [] = 
{
LWszystkie kategorie rownowazne,
LOczekiwane przeplywy pieniezne,
LRisk i dojrzalosc,
LPozycja strategiczna i lata na rynku,
LPrawdopodobienstwo oszacowania
};

文件内容符合预期:



< >

Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania

Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania < br>
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania

...(剩下的97行就这样了)


当我使用完全相同的 testArray / strong> polish chars)在* .xls文件中写一些东西(使用libxl库)一切正常。



出了什么问题?

实际上,当我尝试使用相同的代码时, code> std :: string 和 std :: ofstream (不宽)强>抛光字母)。那么宽字符的问题是什么?

解决方案

讨论了StackOverflow,MSDN,CodeGuru,CodeProject等等几十次。但是,在Visual Studio 2013中准备的C ++控制台应用程序的下一个代码可以帮助:

  #includestdafx.h由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>()); //为imbue调用准备参数
const wchar_t * testArray [] =
{
LWszystkie kategorierównoważne,
LOczekiwaneprzepływypieniężne,
L Risk idojrzałość,
LPozycja strategiczna i lata na rynku,
LPrawdopodobieństwooszacowania
};

void FaultyFunction(void)
{
_setmode(_fileno(stdout),_O_U16TEXT); // for debugging;如果省略,
// std :: wcout将被截断,
std :: wofstream test_file(test.txt);
// test_file<< L\xEF\xBB\xBF; //字节顺序标记:不需要也不推荐
//重要:在imbue之前写BOM
test_file.imbue(utf8_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'\\\
'; // for debugging
}
test_file<< L'\\\
';
}
}

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


Code:

#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" after execution:

Wszystkie kategorie równowa

(Yes, that's the whole file!)

Now, I don't know if that's a problem with std::wofstream, file encoding or what but the result is at the very least strange. But when I remove polish letters:

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"
};

The file content is as expected:

Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania
Wszystkie kategorie rownowazne Oczekiwane przeplywy pieniezne Risk i dojrzalosc Pozycja strategiczna i lata na rynku Prawdopodobienstwo oszacowania
... (it goes on like this for the remaining 97 lines)

And to add insult to injury when I use the very same testArray (with polish chars) to write some things in an *.xls file (using libxl library) everything works just fine.

What's wrong? How can I save polish letters in a text file?

Edit: Actually, when I tried the same code but with std::string and std::ofstream (not wide), it also worked fine (with polish letters). So what's the problem with the wide chars?

解决方案

Discussed on StackOverflow, MSDN, CodeGuru, CodeProject etc. dozens of times already. However, next code for a C++ console application prepared in Visual Studio 2013 could help:

#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;
}

这篇关于使用波兰字符时,文件内容被截断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆