如何将basic_filebuf与char以外的元素类型一起使用?

时间:2009-09-14 19:53:29

标签: c++ iostream

假设我想使用basic_filebuf读取文件的内容。我有一个名为boost::uintmax_t的类型,其大小为8 bytes。我想写下面的内容:

typedef basic_filebuf<uintmax_t> file;
typedef istreambuf_iterator<uintmax_t> ifile;

file f;
vector<uintmax_t> data, buf(2);

f.open("test.txt", std::ios::in | std::ios::binary);
f.pubsetbuf(&buf[0], 1024);

ifile start(&f), end;
while(start != end)
{
    data.push_back(*start);
    start++;
}

问题是有些bytes被读取,有些则没有。例如,假设文件编号9 bytes中有1-9

|1|2|3|4|5|6|7|8|9|

当我运行上面的代码时,只有一个元素被推回data,其中4 bytes只包含f中的原始数据:

[0|0|0|0|4|3|2|1] --> only element in [data]

我做错了什么?这是我第一次直接使用basic_filebuf,但我知道如何使用filebuf

2 个答案:

答案 0 :(得分:4)

basic_filebuf处理“内部”char类型和“外部”char类型。 “外部”一个是文件的内容,并且始终是字节。 “internal”是模板参数,是与程序​​接口中使用的参数。要在两者之间进行转换,basic_filebuf使用其语言环境的codecvt方面。

因此,如果您希望它直接写入您提供的字节,您有两个选择:

  • 使用“退化”代码,仅在“内部”和“外部”编码之间进行转换,而不是尝试执行转换。
  • 使用basic_filebuf,确保使用“经典”语言环境,然后自己进行演员表演

答案 1 :(得分:0)

  

basic_filebuf类型的对象是   用内部缓冲区创建   键入char *,不管是什么   char_type由类型指定   参数Elem。这意味着一个   Unicode字符串(包含wchar_t   字符)将被转换为   ANSI字符串(包含char   字符)在写入之前   内部缓冲区。存储Unicode   缓冲区中的字符串,创建一个新的   wchar_t类型的缓冲区并设置它   使用basic_streambuf :: pubsetbuf()   方法

来自http://msdn.microsoft.com/en-us/library/tzf8k3z8(VS.80).aspx