istreambuf_iterator<TCHAR> 的用法

Usage of istreambuf_iterator<TCHAR>

我有一段代码可以将 .txt 文件的内容读入字符串。

std::ifstream file("address.txt");  
std::string oldAddress((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

当然,如果我使用 std::wstring 也可以,像这样:

std::wifstream file("address.txt"); 
std::string oldAddress((std::istreambuf_iterator<wchar_t>(file)), std::istreambuf_iterator<wchar_t>());

这是我的问题:假设我不知道字符集是 Unicode 还是多字节,我希望我的代码足够通用以处理这两种选择。为了获得基于 TCHAR 的字符串概念,使用 istreambuf_iterator 的最佳方法是什么?

这是我的尝试,有效,但我想知道是否真的有必要创建这些 typedef。

typedef std::basic_ifstream<TCHAR> tifstream;
typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR>> tstring;

tifstream file("address.txt");  
tstring oldAddress((std::istreambuf_iterator<TCHAR>(file)), std::istreambuf_iterator<TCHAR>());

提前致谢!

如果你想处理你的库不支持的新字符类型(在本例中是 MSVCRT),除了与你的字符类型相关的常规 typedef 之外,你还应该提供 char_traits.

char_traits 对于您的字符类型很重要,如果没有比较、长度和其他静态专门用于字符的例程将无法工作,您将面临不良行为。

确保您将 char_traits 模板专门用于 TCHAR

template<>
struct char_traits<TCHAR>
{   

实际上,除非与 win32 API 交互,否则我不会理会 TCHAR。那么在那种情况下,我也只使用 win32 API 的 wchar_t 接口,并且在内部处理文本时通常更喜欢使用 wchar_t,以便能够支持多个脚本同时。此外,wchar_t 等于 WCHAR,这是使用 UTF-16 编码的 MS Windows 的内部字符类型。请注意,尽管在内部使用 UTF-16 也有其问题,因为即使在那里一个字母仍然可以使用多个 Unicode 代码点并且一个单一代码点仍然可以使用多个 wchar_t 元素,这使得子字符串操作变得困难。

关于文件输入,您没有询问但在您的示例代码中仍然提到,这是另一回事。首先,使用带有 UTF-16 编码的 wchar_t(又名 WCHAR)作为文本的内部表示,您可以使用任何编码读取文本文件。但是,在读取文件时,您需要知道文件的编码,然后才能对其进行相应的解码。对不同的文件编码使用不同的内部表示是错误的做法。