所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
ifstream
, 类似 istream, 有一个被称为 get pointer 的指针,指向下一个将被读取的
元素。
ofstream,
类似 ostream,
有一个指针 put pointer
,指向写入下一个元素的位置。
fstream,
类似 iostream, 同时继承了 get
和 put
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
tellg()
和 tellp()
这两个成员函数不用传入参数,返回 pos_type 类型的值(根据 ANSI-C++ 标准) ,就是
一个整数,代表当前 get
流指针的位置 (用 tellg)
或 put 流指针的位置(用 tellp).
seekg() 和 seekp()
这对函数分别用来改变流指针 get 和 put 的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数
类型与函数 tellg 和 tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用这个原型可以指定由参数 direction 决定的一个具体的指针开始计算的一个位移
(offset)。它可以是:
ios::beg
从流开始位置计算的位移
ios::cur
从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移
流指针 get
和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是
不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文
本文件模式打开的文件总是使用 seekg
和 seekp 的第一种原型,而且不要对 tellg 或
tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意
外的行为产生。
以下例子使用这些函数来获得一个二进制文件的大小:
// obtaining file size
#include <iostream.h>
#include <fstream.h>
const char * filename = "example.txt";
int main () {
long l,m;
ifstream file (filename, ios::in|ios::binary);
l = file.tellg();
file.seekg (0, ios::end);
m = file.tellg();
file.close();
cout << "size of " << filename;
cout << " is " << (m-l) << " bytes.\n";
return 0;
}
size of example.txt is 40 bytes.
二进制文件(Binary files)
在二进制文件中,使用<< 和>>,以及函数(如 getline)来操作符输入和输出数据,
没有什么实际意义,虽然它们是符合语法的。
文件流包括两个为顺序读写数据特殊设计的成员函数: write
和 read。第一个函数
(write) 是 ostream 的一个成员函数,都是被 ofstream 所继承。而 read 是 istream
的一个成员函数,被 ifstream
所继承。类 fstream 的对象同时拥有这两个函数。它们
的原型是:
write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数 size 是一个整数值,表示
要从缓存(buffer)中读出或写入的字符数。
// reading binary file