获取std :: fstream文件的文件大小有很多问题,但它们都以字节为单位返回文件大小,并且如果文件在另一个流中打开,则容易出错。码流中的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 forfact不使用codecvt
。而且,在VS2010的版本中,我们甚至没有提到codecvt::length()
成员。事实上,每次调用codecvt::in()
时,都会创建一个新的字符串对象,并且每次增加1个字符的大小,in()
返回partial
。它不是调用codecvt::max_length()
成员,而是使用适当的缓冲区提供呼叫。
这是我的实施还是我可以期望别人也这样做? std::fstream
已被重写为VS2012充分利用语言环境?
基本上,我厌倦了每次使用文本文件时都必须编写自己的文件处理程序。我希望创建一个fstream
派生类,它将首先读取文件BOM(如果存在),并填入正确的codecvt
。然后将这些字符转换为char
,wchar_t
或代码要求的任何内容。我也希望以这样的方式对其进行编码,如果已知编码的先前知识,则可以在构建时指定locale
。
我会更好地直接在内部缓冲区工作,影响重写fstream类还是有一些我不知道的技巧?
看来,一般一个坏主意,试图弄清楚码点一个UTF8编码文件的大小。你必须阅读整个文件。我认为应该没有理由提前知道这个大小。同时分配缓冲区以适应整个文件也很危险,因为文件可能很大而且不适合。一块一块地阅读它。 – madnut
@madnut我同意加载整个文件不好,因此我使用'codecvt'。主要问题是在文件中寻找。这些fstreams不是文本文件友好的。但是我认为你在事先知道文件的长度方面是错误的。在某些情况下,它是必需的。 – Twifty