4

假设我想使用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.

4

2 回答 2

4

basic_filebuf 处理“内部”字符类型和“外部”字符类型。“外部”是文件的内容,总是字节。“内部”的参数是模板参数,是在其与程序的接口中使用的参数。为了在两者之间进行转换,basic_filebuf 使用其语言环境的 codecvt 方面。

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

  • 使用仅在“内部”和“外部”编码之间转换的“退化”编解码器,而不是尝试执行转换。
  • 使用 basic_filebuf,确保使用“经典”语言环境,并进行强制转换以 char 自己
于 2009-09-14T20:47:55.447 回答
0

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

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

于 2009-09-14T19:57:55.200 回答