用c ++读取txt文件(中文)

时间:2016-02-11 08:54:38

标签: c++ locale

我正在尝试开发检查用户输入的中文单词是否在txt文件中的函数。以下是代码。但它没有用。我想知道问题所在。请帮帮我。

setlocale(LC_ALL, "Chinese-simplified");
locale::global(locale("Chinese_China"));
SetConsoleOutputCP(936);
SetConsoleCP(936);

bool exist = FALSE;

cout << "\n\n <Find the keyword whether it is in that image or not> \n ";
cout << "Enter word to search for: ";
wstring search;
wcin >> search; //There is a problem to enter chinese.

wfstream file_text("./a.txt");
wstring line;
wstring::size_type pos;

while (getline(file_text, line))
{
    pos = line.find(search);
    if (pos != wstring::npos) // string::npos is returned if string is not found
    {
        cout << "Found!" << endl;
        exist = true;
        break;
    }
}

当我使用此代码时,结果如下。

const int oldMbcp = _getmbcp();
_setmbcp(936);
const std::locale locale("Chinese_China.936");
_setmbcp(oldMbcp);

enter image description here

3 个答案:

答案 0 :(得分:2)

如果您对更多详情感兴趣,请参阅stod-does-not-work-correctly-with-boostlocale,详细了解locale如何运作,

简而言之,对你来说更有趣的部分是:

  1. std::streamstringstreamfstreamcincout)有一个内部语言环境对象,它与全局C ++语言环境的值相匹配< strong>目前创建流对象。由于std::in是在调用main中的代码之前很久创建的,因此无论您以后做什么,它都很可能是经典的C语言环境。
  2. 您可以通过调用std::stream来确保std::stream::imbue(std::locale(your_favorit_locale))对象具有所需的区域设置。
  3. 我想补充以下内容:

    1. 设置全局语言环境几乎绝不是一个好主意 - 它可能会破坏程序的其他部分或第三部分库 - 您永远不会知道。

    2. std::setlocalelocale::global做的事情略有不同,但locale::global不仅重置了全局c ++ - 语言环境,还重置了c-locale(也由{{{ 1}},不要与经典的“C”语言环境混淆),所以如果你想将c ++语言环境设置为std::setlocale而将C语言环境设置为Chinese_China

    3. 首先     chinese-simplified

      而不是     locale::global(locale("Chinese_China"));

答案 1 :(得分:1)

尝试locale::global(locale("Chinese_China.936"));locale::global(locale("")); 对于LC_ALL "chinese-simplified""chs"

答案 2 :(得分:1)

如果使用Vladislav's answer无法解决此问题,请查看answerstl - Shift-JIS decoding fails using wifstrem in Visual C++ 2013 - Stack Overflow

const int oldMbcp = _getmbcp();
_setmbcp(936);
const std::locale locale("Chinese_China.936");
_setmbcp(oldMbcp);

似乎有a bug in Visual Studio's implementation of locales。另请参阅c++ - double byte character sequence conversion issue in Visual Studio 2015 - Stack Overflow