7

我想将 a 写入std::wstring文件并需要将该内容读取为std:wstring. 当字符串为L"<Any English letter>". 但是当我们有孟加拉语、卡纳达语、日语等任何类型的非英语字母时,问题就出现了。尝试了各种选项,例如:

  1. 将文件转换std::wstringstd::string并写入文件以及读取时间读取为std::string并转换为std::wstring
    • 正在写作(我可以从编辑中看到)但阅读时间出现错误的字符
  2. 写入std::wstringwofstream,这也无助于母语字符字母,例如 std::wstring data = L"হ্যালো ওয়ার্ল্ড";

平台是mac和Linux,语言是C++

代码:

bool
write_file(
    const char*         path,
    const std::wstring  data
) {
    bool status = false;
    try {
        std::wofstream file(path, std::ios::out|std::ios::trunc|std::ios::binary);
        if (file.is_open()) {
            //std::string data_str = convert_wstring_to_string(data);
            file.write(data.c_str(), (std::streamsize)data.size());
            file.close();
            status = true;
        }
    } catch (...) {
        std::cout<<"exception !"<<std::endl;
    }
    return status;
}


// Read Method

std::wstring
read_file(
    const char*  filename
) {
    std::wifstream fhandle(filename, std::ios::in | std::ios::binary);
    if (fhandle) {
        std::wstring contents;
        fhandle.seekg(0, std::ios::end);
        contents.resize((int)fhandle.tellg());
        fhandle.seekg(0, std::ios::beg);
        fhandle.read(&contents[0], contents.size());
        fhandle.close();
        return(contents);
    }
    else {
        return L"";
    }
}

// Main

int main()
{
  const char* file_path_1 = "./file_content_1.txt";
  const char* file_path_2 = "./file_content_2.txt";

  //std::wstring data = L"Text message to write onto the file\n";  // This is happening as expected
  std::wstring data = L"হ্যালো ওয়ার্ল্ড";
// Not happening as expected.

  // Lets write some data
  write_file(file_path_1, data);
 // Lets read the file
 std::wstring out = read_file(file_path_1);

 std::wcout<<L"File Content: "<<out<<std::endl;
 // Let write that same data onto the different file
 write_file(file_path_2, out);
 return 0;
}
4

5 回答 5

3

awchar_t的输出方式取决于语言环境。默认语言环境 ( "C") 通常只接受 ASCII(Unicode 代码点 0x20...0x7E,加上一些控制字符。)

任何时候程序处理文本,第一个语句 main应该是:

std::locale::global( std::locale( "" ) );

如果程序使用任何标准流对象,则代码还应在任何输入或输出之前为它们注入全局语言环境。

于 2013-08-02T08:33:18.037 回答
0

要读取和写入 unicode 文件(假设您要编写 unicode 字符),您可以尝试 fopen_s

FILE *file;

if((fopen_s(&file, file_path, "w,ccs=UNICODE" )) == NULL)
{
    fputws(your_wstring().c_str(), file);
}
于 2013-08-02T08:29:56.453 回答
0

稍后编辑:这是针对 Windows 的(因为在回答时没有标签)

您需要将流设置为支持这些字符的语言环境。尝试这样的事情(对于 UTF8/UTF16):

std::wofstream myFile("out.txt"); // writing to this file 
myFile.imbue(std::locale(myFile.getloc(), new std::codecvt_utf8_utf16<wchar_t>));

当您从该文件中读取时,您必须做同样的事情:

std::wifstream myFile2("out.txt"); // reading from this file
myFile2.imbue(std::locale(myFile2.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
于 2013-08-02T08:34:40.840 回答
0

一个可能的问题是当您读回字符串时,因为您将字符串的长度设置为文件中的字节数而不是字符数。这意味着您尝试读取文件末尾的内容,并且字符串末尾将包含垃圾。

如果您正在处理文本文件,为什么不简单地使用正常的输出和输入运算符<<>>其他文本函数,例如std::getline

于 2013-08-02T08:38:06.923 回答
0

不要使用 wstring 或 wchar_t。如今,在非 Windows 平台上wchar_t 几乎毫无价值

相反,您应该使用 UTF-8。

bool
write_file(
    const char*         path,
    const std::string   data
) {
    try {
        std::ofstream file(path, std::ios::out | std::ios::trunc | std::ios::binary);
        file.exceptions(true);
        file << data;
        return true;
    } catch (...) {
        std::cout << "exception!\n";
        return false;
    }
}


// Read Method

std::string
read_file(
    const char*  filename
) {
    std::ifstream fhandle(filename, std::ios::in | std::ios::binary);

    if (fhandle) {
        std::string contents;
        fhandle.seekg(0, std::ios::end);
        contents.resize(fhandle.tellg());
        fhandle.seekg(0, std::ios::beg);
        fhandle.read(&contents[0], contents.size());
        return contents;
    } else {
        return "";
    }
}

int main()
{
  const char* file_path_1 = "./file_content_1.txt";
  const char* file_path_2 = "./file_content_2.txt";

  std::string data = "হ্যালো ওয়ার্ল্ড"; // linux and os x compilers use UTF-8 as the default execution encoding.

  write_file(file_path_1, data);
  std::string out = read_file(file_path_1);

  std::wcout << "File Content: " << out << '\n';
  write_file(file_path_2, out);
}
于 2013-08-02T17:36:41.887 回答