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
)作为文本的内部表示,您可以使用任何编码读取文本文件。但是,在读取文件时,您需要知道文件的编码,然后才能对其进行相应的解码。对不同的文件编码使用不同的内部表示是错误的做法。
我有一段代码可以将 .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
)作为文本的内部表示,您可以使用任何编码读取文本文件。但是,在读取文件时,您需要知道文件的编码,然后才能对其进行相应的解码。对不同的文件编码使用不同的内部表示是错误的做法。