曲径通幽论坛

标题: seekg()/seekp() -- 移动输入和输出指针 [打印本页]

作者: beyes    时间: 2011-11-30 14:48
标题: seekg()/seekp() -- 移动输入和输出指针
在 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 个字节,如:
./seek test.txt 8 10
下面程序演示了 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

作者: beyes    时间: 2011-11-30 15:01
标题: tellg()/tellp() -- 返回当前的输入输出位置
对应于上面的 seekg() 和 seekp() 两个函数,有 tellg() 和 tellp() 两个函数分别可以返回文件中输入和输出指针的当前位置。函数原型如下:
pos_type tellg();
pos_type tellp();
其中 pos_type 是类 ios 中定义的类型,它能够保存上面两个函数所能返回的最大值。

此外,seekg() 和 seekp() 也有重载的形式,它们可以将文件的输入或输出指针移动到由 tellg() 或 tellp() 返回值所指定的位置。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2