七、输入/输出流---随机访问

来源:互联网 发布:中国网络诗歌首页 编辑:程序博客网 时间:2024/06/01 01:33

7 随机存取

各种流类型通常支持对流中的数据的随机访问;标准库提供一对函数,来定位(seek)到流中给定的位置,以及告诉(tell)我们当前的位置;

  1. 虽然标准库为所有的流定义了seek和tell函数,是否有意义依赖于绑定到那个设备。
  2. 绑定到cin,cout,cerr和clog的流不支持随机访问;
  3. 对于istream和ostream类型通常不支持随机访问,所以一般只适用于fstreamsstream类型。

1 seek 和tell函数

1、标准库定义了两对seek和tell函数
2、g版本对于输入
3、p版本对于输出

函数 意义 tellg() / tellp() 返回一个输入流中(tellg)或输出流中(tellp)标记的当前位置 seekg(pos) / seekp(pos) 在一个输入流或者输出流中将标记重定位到给定的绝对位置。pos通常是前一个tellg或者tellp返回的值 seekp(offf,from) /seekg(off,from) 在一个输入流或者输出流中将标记定位到from之前或之后off个字符,from可以是下列的值:(1).beg: 偏移量相对于流开始的位置 (2). cur: 偏移量相对于流当前的位置 (3).end: 偏移量相对于流结尾的位置

说明:
1. 对于某些只读或只写的流,我们可以对这些流只使用g或者p版本。

例子:(在文件末尾添加统计逐行累加的字节数)

//------------------------省略-----------------fstream  inout("test.txt", ios::ate |ios::in|ios::out|ios::binary);if (!inout) return -1;streampos end_mark = inout.tellg();  //获得末尾位置,ate自动定位末尾位置inout.seekg(0, fstream::beg); //定位到文件开始位置size_t count = 0;string line;while (inout && inout.tellg() != end_mark && getline(inout, line)){    //加一是换行符    count += line.size() + 1;    //获取当前位置    streampos mark = inout.tellg();     //定位到文件尾部     inout.seekg(0, fstream::end);     inout << count;   //写入文件累计的字符个数    if (mark != end_mark)        inout << "      ";              //如果不是到达内容尾部,就添加空白;    inout.seekg(mark);  //恢复}inout.seekg(0,fstream::end);   //定位到末尾inout << "\n";inout.seekg(0,fstream::beg);char ch;while (inout.get(ch)){    cout << ch;}//------------------省略-------

结果为:

第一行第二行第三行第四行7      14      21      28

test.txt以ansi格式保存;当写会数据的时候就是会变成乱码。。有点疑惑。。。还未解决!

阅读全文
0 0
原创粉丝点击