1.文件写操作
可参考 文件写操作
2.文件读操作
采用标准库里面的read()
;
函数原型:
istream& read (char* s, streamsize n);
s为文件名,n为要读取的字节长度。
几个常用的成员函数:
(1). stream& seekg
(streamoff off, ios_base::seekdir way)
(2) 第二个参数有以下几种选择
ios_base::beg
数据流的头
ios_base::cur
数据流的当前位置
ios_base::end
数据流的尾
例如:
in.seekg(0, in.end);
//追溯到流的尾部,ios::end
是代表流的结尾,0代表偏移量。
in.seekg(0, ios::end);
//意思是直接跳到当前流的结尾,略过流内的所有数据。
int length = in.tellg();
//获取流的长度
in.seekg(0, in.beg);
// 追溯到流的开始,ios::beg
是代表流的开始,0代表偏移量。从文件的开头位置开始,移动 0 字节,实际上就是指移动到文件开头
in.seekg(_size, in.cur);
//追溯到流的当前位置,从当前位置开始,跳过_size
个字节,下次就从这个位置开始读,正负代表左偏右偏
{
char ch[50] = { 0 };
int iReadlen;
ifstream infile("test.txt", ios::binary);
if (!infile)
{
cerr << "open error!" << endl;
exit(1);
}
//统计长度,同时使用者三个
infile.seekg(0, infile.end);
int len = infile.tellg();
infile.seekg(0, infile.beg);
infile.read(ch, 5);//读五个字节
iReadlen = infile.gcount();
infile.seekg(2, infile.cur); //跳过两个字节
infile.read(ch,9);//读9个字节
iReadlen = infile.gcount();
infile.close();
}
(3).streamsize gcount() const;
当前读取字节数
(4)如果read()
读取异常,需要对 标准IO库定义的条件状态进行重新设置,常见的条件状态有:
常量 | 含义 | fail标志位 | oef标志位 | bad标志位 |
---|---|---|---|---|
ios::badbit | 已达到文件结束 | 0 | 0 | 1 |
ios::eofbit | 输入(输出)流出现非致命错误,可挽回 | 0 | 1 | 0 |
ios::failbit | 输入(输出)流出现致命错误,不可挽回 | 1 | 0 | 0 |
ios::goodbit | 流状态完全正常 | 0 | 0 | 0 |
s.clear()
将流s
中的所有状态值都重设为有效状态。
s.clear(flag)
将流s
中的某个指定条件状态置为有效,flag
是strm::iostate
类型的条件状态,若括号内不写具体条件状态则将所有条件状态全部设置有效。
if (VideoFile.read(m_pBuffer, MEMERY_1M))
{
int iBegPos = ForwardGetGroup(0, MEMERY_1M);
int iEndPos = BackwardGetGroup(MEMERY_1M - 1, 0);
//修改1M内的起始帧位置
UpdateFrameNum(iBegPos, iEndPos);
}
else
{
int iBegPos = ForwardGetGroup(0, VideoFile.gcount());
int iEndPos = BackwardGetGroup(VideoFile.gcount() - 1, 0);
UpdateFrameNum(iBegPos, iEndPos);
VideoFile.clear(ios::eofbit); //将eofbit设置为有效
//VideoFile.clear();
VideoFile.seekg(FILE_HEADER_SIZE, VideoFile.beg);
}