c++:如何将任意文件读入std::string

c++: How to read any file into std::string

本文关键字:string 文件 std 任意 c++      更新时间:2023-10-16

我有一堆文本文件,想把它们读入std::string,其中一些是UCS-2, UTF-8编码。如何将它们读入std::string。我只是想读取任何文本文件到std::string。我必须转换它们吗?

如何读取它们取决于您的操作系统支持和您正在使用的区域设置。

如果您只是naïvely读取文件而不触及您的区域设置,并且它们的区域设置与您的std c++库使用的区域设置不匹配,那么您可能会遇到困难。对于单字节字符集和多字节字符集也有类似的问题。

在读取文件之前,没有可靠的方法可以告诉文件的区域设置是什么(元数据可能是错误的),所以一般的策略是先尝试以最常见的格式读取,然后如果失败(即遇到无效字符),再尝试使用不同的格式。即便如此,它也可能是模棱两可的。这是一个看似复杂的问题,您在用疯狂的字符集解析HTML时会遇到同样的问题。

通常,有两组可用的文件I/O函数,一组用于多字节字符集,另一组用于单字节字符集。不过,对该功能的支持是非常特定于平台的,所以如果您使用的是没有添加特殊字符支持的英文本地化操作系统,那么在不使用外部库的情况下,c++可能无法直接支持多字节集。

Microsoft为cin和cout指定了非标准扩展。通过以w作为前缀,它们按字节宽度分隔流。

wcout << "儫";

这可以像您期望的那样工作,但是您必须使用#define _UNICODE才能编译它。顺便说一句,Windows将许多系统API调用分为两个版本,一个接受单字节字符串,另一个接受多字节字符串。即CreateProcessA vs CreateProcessW

总之,IO功能是按照字符集的字节宽度和区域设置划分的。为了给你的问题一个更有针对性的答案,我需要更多地了解你的目标。看一看c++的语言环境支持,可以更好地理解这一点。具体来说,ios_baseimbuegetloc中的locale功能。对于广泛部署的c++版本,目前还没有一个好的方法来处理这些问题,尽管我知道这些问题在即将发布的c++版本中已经得到了缓解。