1、几个函数
为支持随机访问,IO类型维护一个“标志”,该“标志”能决定从何处读或写。
IO类型提供了两对函数:seekg()/tellg()和seekp()/tellp()。前者有输入流使用,后者由输出流使用。这四个函数的功能如下:
seekg() //重新定位输入流中的位置
tellg() // 返回输入流中标记的当前位置
seekp() // 重新定位输出流中的位置
tellp() // 返回输出流中标记的当前位置
seek()有两个版本,一个是定位到文件的“绝对”位置,另一个是移到给定位置的字节偏移量处。即:
seekg(position) seekg(offset,dir)
seekp(position) seekp(offset,dir)
position--绝对位置
offset--偏移量
dir--从何处偏移的指示器。可取beg(流的开头)、cur(流的当前位置)、end(流的末尾)。当前位置有tell()返回,返回的类型由pos_type来代替。
2、实例 -- 读写同一文件
有一文件“test.txt”,在其末尾加上一新行,该行包含每一行的字符数。假定文件的内容为:
123456
12345
1234
修改过的文件应为:
123456
12345
1234
6 5 4
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
fstream in_out;
in_out.open("test.txt", fstream::ate | fstream::in | fstream::out);
if (!in_out)
{
cerr << "Unable to open file!" << endl;
return EXIT_FAILURE;
}
ifstream::pos_type end_make = in_out.tellg();
int ncount = 0;
string strline;
in_out.seekg(0, fstream::beg);
while ( in_out && in_out.tellg() != end_make && getline(in_out, strline, '\n'))
{
ncount = strlen(strline.c_str());
ifstream::pos_type mark = in_out.tellg();
in_out.seekg(0, fstream::end);
in_out << ncount;
if ( mark != end_make )
{
in_out << " ";
}
in_out.seekg(mark);
}
in_out.clear();
return 0;
}