typedef struct {
char c[20];
int i;
} header;
void foo(std::string s) {
std::ifstream ifs(s.c_str(), std::ios_base::binary | std::ios_base::in);
if (ifs) {
std::filebuf* pbuf = ifs.rdbuf();
pbuf->pubseekpos(std::ios_base::beg);
// ... ?
}
}
我正在尝试以C ++方式读取二进制模式的文件,我无法确定调用从文件中读取位的正确方法,read
为ifstream
但如果我应该使用那种方法,那么filebuf
是什么意思?
为简化起见,我有struct
表示标题的顺序,大小和字段,我希望有一个方法可以保留这个结构的实例并将其写入正确的字段就像来自C的fread
有人可以澄清filebuf
的要点以及通过未格式化的数据流读取文件时应该使用哪种方法?
答案 0 :(得分:2)
只需使用basic_istream<>::read()
来读取未格式化的原始字节数据:
void foo(std::string s) {
std::ifstream ifs(s.c_str(), std::ios_base::binary | std::ios_base::in);
if (ifs) {
char buffer[20];
if (!ifs.read(buffer, 20)) {
// Handle error
}
}
}
答案 1 :(得分:2)
首先,filebuf
的真正意义在于它源自
streambuf
,以及其streambuf为filebuf的istream
将表现得很像ifstream
。这个很重要;该
>>
运算符不是虚拟的,因为其中很多都不是虚拟的
成员,他们不能虚拟。所有输入必须通过
istream
,而不是从中派生的ifstream
。更多
通常,ifstream
可以被认为是公正的
便利课;它的构造函数提供istream
带有filebuf
的基类,它的析构函数会破坏
filebuf
,它提供对功能的访问
基数filebuf
中不存在的streambuf
。
这并不意味着您无法直接使用streambuf
,
你可以,并且有些情况下它是合适的。但如果
你这样做,你必须处理错误处理。当你
调用istream::read
要求一定数量的字节,和
那些字节不存在,istream::read
将注明结束
文件,设置必要的错误位,并提供计数
通过istream::gcount
实际阅读的内容。如果你是
逐字节读取,不知道可能有多少字节
是的,那么所有这些可能并不意味着什么(但你可能会想要
如果你看到EOF,设置eofbit
。如果你想读书
然后是一个特定的字节数(比如一个四字节整数)
如果不能,istream:read
将设置适当的错误位
读取四个字节,这样您就可以轻松测试错误。
修改
另外一条评论:你应该把阅读
该文件位于一个单独的进程中,需要std::istream&
。
你真的不希望阅读代码知道它是
处理ifstream
,而不是其他一些
流。 (另外:如果你刚刚开业,就没有必要去寻找
文件。)
答案 2 :(得分:1)
有一个
read
ifstream
是的,这就是您用来从流中读取未格式化数据的内容;因此得名。
如果我应该使用那种方法,那么
filebuf
是什么意思?
流用于处理低级文件访问和缓冲。如果您需要处理这些细节,可以访问它,但通常没有必要。如果你只是想从流中读取,你肯定不会搞乱它。
答案 3 :(得分:1)
filebuf有什么意义?
没有,这里。
我不明白你为什么要使用它。
在执行更复杂的操作之前,filebuf
是一个实现细节†。
†(排序。)