曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4565|回复: 1
打印 上一主题 下一主题

seekg()/seekp() -- 移动输入和输出指针

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-11-30 14:48:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 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

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
沙发
 楼主| 发表于 2011-11-30 15:01:09 | 只看该作者

tellg()/tellp() -- 返回当前的输入输出位置

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

此外,seekg() 和 seekp() 也有重载的形式,它们可以将文件的输入或输出指针移动到由 tellg() 或 tellp() 返回值所指定的位置。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 07:39 , Processed in 0.063337 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表