获取 std::fstream 文件的文件大小有很多问题,但它们都以字节为单位返回文件大小,并且如果文件在另一个流中打开,则容易出错。
我想知道代码点中的文件大小,而不是字节。
现在std::fstream::seekg(0,std::ios::end)
后面std::fstream::tellg()
只返回字节长度。这并没有告诉我文件中有多少 UTF-16/32 字符。将结果除以sizeof(wchar_t)
我听到你说的。不适用于 UTF-8 文件且不可移植。
现在,对于更有技术意识的人,我有imbued
自己的std::codecvt
班级。std::codecvt
有一个成员length()
,给定两个指向流的指针,计算长度并返回最大或输出字符数。我原以为在文件上搜索会按基本类型codecvt::intern_type
而不是按基本char
类型搜索。
我查看了fstream
标题,发现 seek 事实上不使用codecvt
. 而且,在我的 VS2010 版本中,codecvt::length()
甚至没有提到该成员。事实上,在每次调用时,都会创建一个新的字符串对象,每次返回时都会codecvt::in()
增加 1 个字符。相反,它不会调用成员并为调用提供足够的缓冲区。in()
partial
codecvt::max_length()
这只是我的实现还是我可以期望其他人也这样做?是否std::fstream
已针对 VS2012 重写以充分利用语言环境?
基本上,我厌倦了每次使用文本文件时都必须编写自己的文件处理程序。我希望创建一个fstream
派生类,该类将首先读取文件 BOM(如果存在)并灌输正确的codecvt
. 然后将这些字符转换为char
,wchar_t
或代码要求的任何字符。我还希望以这样一种方式对其进行编码,即如果已知编码的先验知识,则locale
可以在构造时指定 a 。
直接在内部缓冲区上工作会更好,影响重写 fstream 类还是有一些我不知道的技巧?