gpt4 book ai didi

c++ - 为什么 `std::basic_ifstream` 在 c++11 中不起作用?

转载 作者:行者123 更新时间:2023-12-01 14:08:02 25 4
gpt4 key购买 nike

以下代码按预期工作。源代码,文件“file.txt”和“out.txt”都是用utf8编码的。但是当我改变时它不起作用wchar_tchar16_tmain() 的第一行.我用 -std=c++11 试过 gcc5.4 和 clang8.0 .我的目标是替换 wchar_tchar16_t , 如 wchar_t在 RAM 中占用两倍的空间。我认为这两种类型在 c++11 和更高版本的标准中同样得到很好的支持。我在这里想念什么?

#include<iostream>
#include<fstream>
#include<locale>
#include<codecvt>
#include<string>

int main(){
typedef wchar_t my_char;

std::locale::global(std::locale("en_US.UTF-8"));

std::ofstream out("file.txt");
out << "123正则表达式abc" << std::endl;
out.close();

std::basic_ifstream<my_char> win("file.txt");
std::basic_string<my_char> wstr;
win >> wstr;
win.close();

std::ifstream in("file.txt");
std::string str;
in >> str;
in.close();

std::wstring_convert<std::codecvt_utf8<my_char>, my_char> my_char_conv;
std::basic_string<my_char> conv = my_char_conv.from_bytes(str);

std::cout << (wstr == conv ? "true" : "false") << std::endl;

std::basic_ofstream<my_char> wout("out.txt");
wout << wstr << std::endl << conv << std::endl;
wout.close();

return 0;
}

编辑

修改后的代码不能用 clang8.0 编译。它使用 gcc5.4 编译,但在运行时崩溃,如@Brian 所示。

最佳答案

各种流类需要一组定义才能操作。标准库只需要 char 的相关定义和对象和 wchar_t但不适用于 char16_tchar32_t .在我的头顶上,需要使用以下内容 std::basic_ifstream<cT>std::basic_ofstream<cT> :

  • std::char_traits<cT>指定字符类型的行为方式。我认为这个模板专门用于char16_tchar32_t .
  • 二手 std::locale需要包含 std::num_put<cT> 的实例格式化数字类型的方面。这个方面可以被实例化和一个新的 std::locale可以创建包含它,但标准不强制要求它存在于 std::locale 中。目的。
  • 二手 std::locale需要包含构面的实例 std::num_get<cT>读取数字类型。同样,这个方面可以被实例化,但默认情况下不需要存在。
  • 刻面 std::numpunct<cT>需要专门投入使用std::locale处理小数点、千位分隔符和文本 bool 值。即使它没有真正被使用,它也会被数字格式和解析函数引用。没有现成的特化 char16_tchar32_t .
  • 刻面 std::ctype<cT>需要专门化并放入使用的facet中,以支持字符类型的加宽、缩小和分类。没有现成的特化 char16_tchar32_t .
  • 刻面 std::codecvt<cT, char, std::mbstate_t>需要专门投入使用std::locale在外部字节序列和内部“字符”序列之间进行转换。没有现成的特化 char16_tchar32_t .

  • 大多数方面都相当容易做到:它们只需要转发一个简单的转换或进行表查找。然而, std::codecvt facet 往往相当棘手,尤其是因为 std::mbstate_t从标准 C++ 库的角度来看,是一种不透明类型。

    所有这些都可以做到。自从我上次对字符类型进行概念实现证明已经有一段时间了。我花了大约一天的时间工作。当然,当我开始工作时,我已经实现了语言环境和 IOStreams 库,我知道我需要做什么。添加合理数量的测试而不是仅仅进行简单的演示可能需要我一周左右的时间(假设我实际上可以专注于这项工作)。

    关于c++ - 为什么 `std::basic_ifstream<char16_t>` 在 c++11 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63321284/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com