我有一段代码将.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还是多字节,我希望我的代码足够通用以处理这两个选项。哪个是使用istreambuf_iterator以获取基于TCHAR
的字符串概念的最佳方法?
这是我的尝试,但是我想知道创建这些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>());
提前致谢!
答案 0 :(得分:3)
如果你想处理你的库不支持的新字符类型(在这种情况下它是MSVCRT),除了与你的字符类型相关的常规typedef之外,你还应该提供一个char_traits。
char_traits对于你的角色类型很重要,如果没有比较,长度和其他静态专用于该角色的例程将无效,你将面临不良行为。
确保您将char_traits模板专门用于TCHAR
template<>
struct char_traits<TCHAR>
{
答案 1 :(得分:0)
实际上,除非与win32 API接口,否则我不会打扰TCHAR
。在那种情况下,我也只是使用win32 API的wchar_t接口,并且在内部处理文本时更喜欢使用wchar_t
,以便能够同时支持多个脚本。此外,wchar_t等于WCHAR
,这是使用UTF-16编码的MS Windows的内部字符类型。请注意,虽然在内部使用UTF-16也存在问题,因为即使有一个字母仍然可以使用多个Unicode代码点,而且一个sigle代码点仍然可以使用多个wchar_t
元素,这使得子字符串操作变得困难。
关于文件输入,您没有询问但在示例代码中仍然提到过,这是另一回事。首先,使用带有UTF-16编码的wchar_t
(aka WCHAR
)作为文本的内部表示,允许您使用任何编码读取文本文件。但是,在读取文件时,您需要知道文件的编码,然后允许您相应地对其进行解码。对不同的文件编码使用不同的内部表示将是错误的方法。