在 C++ 的 I/O 系统中,可以使用 seekg() 和 seekp() 进行定位访问。seekg() 用来移动输入指针(指向下一个输入操作要发生的位置),seekp() 用来移动输出指针(指向下一个输出操作要发生的位置)。
这两个函数的通用形式如下:
istream &seekg(off_type offset, seekdir origin);
ostream &seekp(off_type offset, seekdir origin); 其中,off_type 是在类 ios 中定义的整数类型,它定义了 offset 能够包含的最大数值。seek 是枚举型变量,它可以是下面的几个值:
值 | 含义
| ios::beg | 文件的起始位置
| ios::cur | 文件的当前位置
| ios::end | 文件的末尾
|
这两个函数就是从上面的值所指定的位置开始处进行操作的。
一般情况下,只有文件以二进制模式打开时才能用这种方式进行 I/O 操作。如果是以文本模式打开,那么会发生字符转换,从而使得文件位置与文件中的实际内容不一致。
下面程序演示了 seekp() 的用法,程序将在某个位置上写入 X :
[C++] 纯文本查看 复制代码 #include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(int argc, char **argv)
{
if (argc != 4) {
cout << "Uage: CHANGE <filename> <location> <nbytes>\n";
return 1;
}
int i;
int nbytes = atoi(argv[3]);
fstream out(argv[1], ios::in | ios::out | ios::binary);
if (!out) {
cout << "Cannot open file.\n";
return 1;
}
out.seekp(atoi(argv[2]), ios::beg);
for (i = 0; i < nbytes; i++)
out.put('X');
out.close();
return 0;
}
利用上面程序,对一个 test.txt 的文本文件写入 10 个大写字符 'X' ,在输入 'X' 之前,从文件头移动 8 个字节,如:下面程序演示了 seekg() 的用法,然后会利用该程序从文件头偏移10 个字节的位置后读入 8 个字符:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
char ch;
if (argc != 3) {
cout << "Usage: NAME <filename> <starting location>\n";
return 1;
}
ifstream in(argv[1], ios::in | ios::binary);
if(!in) {
cout << "Cannot open file.\n";
return 1;
}
in.seekg(atoi(argv[2]), ios::beg);
while (in.get(ch))
cout << ch;
cout << endl;
return 0;
}
运行输出:./seekg test.txt 10
XXXXXXXX |