文件操作 tellg,tellp,seekp,seekg函数

c++ fstream中seekg()和seekp()的用法

C++中seekp()和seekg()函数功能

seekp:设置输出文件流的文件流指针位置
seekg:设置输入文件流的文件流指针位置
函数原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
函数参数
pos:新的文件流指针位置值
off:需要偏移的值
dir:搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置
在ios中定义的枚举类型:
enum seek_dir {beg, cur, end};
每个枚举常量的含义:
ios::beg:文件流的起始位置
ios::cur:文件流的当前位置
ios::end:文件流的结束位置

tellg() ——返回一个int型数值,它表示“内置指针”的当前位置。此函数仅当你在读取一个文件时有效。例如:
    #include <fstream.h>
     void main()
    {
        // 假如我们已经在test_file.txt中存有了“Hello”的内容
        ifstream File("test_file.txt")    
        char arr[10];    
        File.read(arr,10);        
        // 由于Hello占5个字符,因此这里将返回5
        cout << File.tellg() << endl;     
        File.close();
    }    
    tellp() —— 与tellg()有同样的功能,但它用于写文件时。总而言之:当我们读取一个文件,并要知道内置指针的当前位置时,应该使用tellg();当我们写入一个文件,并要知道内置指针的当前位置时,应该使用tellp(). 由于此函数的用法与tellg()完全一样,我就不给出示例代码了。    
    seekp() —— 还记得seekg()么?当我在读取一个文件,并想到达文件中某个特定位置时,就曾使用过它。seekp()亦如此,只不过它用于写入一个文件的时候。例如,假如我在进行文件读写,而要定位到当前位置的三个字符之前,则需调用FileHandle.seekg(-3). 但如果我是在写入一个文件,并且比如我要重写后5个字符的内容,我就必须往回跳转5个字符,因而,我应该使用FileHandle.seekp(-5) .    
    ignore() —— 使用于读取文件之时。如果你想略过一定数量的字符,只需使用此函数。实际上,你也可以使用seekg()来代替,然而使用ignore()有一个优点——你可以指定一个特定“界限规则(delimiter rule)”,同样使得ignore()在指定的位置停下。函数原型如下:    
    istream& ignore( int nCount, delimiter );    
    nCount表示要略过的字符数量,而delimiter —— 与它的名称有着同样的含义:假如你想在文件末尾停下,则可使用EOF值传入,这样一来此函数就等同于seekg();但该参数还可以使用其他值,例如‘\n’这样可以在换行的同时定位在新行处。下面是示例:
    #include <fstream.h>    
    void main()
    {
        // 假设test_file.txt中已经存有"Hello World"这一内容
        ifstream File("test_file.txt");    
        static char arr[10];    
        // 假如一直没有遇到字符"l",则向前定位直到跳过6个字符
        // 而如果期间遇到"l",则停止向前,定位在该处
        File.ignore(6,''l'');     
        File.read(arr,10);    
        cout << arr << endl; // 它将显示"lo World!"    
        File.close();    
    }    
    getline() —— 虽然前面的章节中我曾提到过这个函数,但还有一些内容我们未曾涉及:此函数不但可用于逐行读取,而且它还可以设为遇到某个特定字符后停止读取。下面给出传递这一参数的方法:    
    getline(array,array_size,delim);    
    以下为示例代码:    
    #include <fstream.h>    
    void main()
    {
        // 假设test_file.txt中已经存有"Hello World"这一内容
        ifstream File("test_file.txt");    
        static char arr[10];    
       
        File.getline(arr,10,''o'');    
        cout << arr << endl; // 将显示"Hell"
        File.close();
    }    
    peek() —— 此函数将返回输入流文件的下一个字符,但它不移动内置指针。我想你该记得,像get()这样的函数也返回输入流文件的下一个字符,而与此同时它将移动内置指针。所以当你再次调用get()函数的时候,它会返回再下一个字符,而非前面那个。哦,使用peek()也会返回字符,但它不会移动“光标”。所以,假如你连续两次调用peek()函数,它会返回同一个字符。考虑以下代码:    
    #include <fstream.h>    
    void main()
    {
        // 假设test_file.txt中已经存有"Hello World"这一内容
        ifstream File("test_file.txt");    
        char ch;    
        File.get(ch);
        cout << ch << endl; // 将显示"H"    
        cout <<    char(File.peek()) << endl; //将显示"e"
        cout <<    char(File.peek()) << endl; //将再次显示"e"    
        File.get(ch);
        cout << ch << endl; // 还是显示"e"    
    File.close();        
    }    
    顺便说一下,我忘了讲——peek()函数实质上返回的是字符的ASCII码,而非字符本身。

perl文本处理总结[2] - Cache One

mysql - 从Perl脚本比较MySQL数据库中的日期 - Cache One

mysql - Perl MySQL DBI-更新并获取上一个值 - Cache One

mysql - 催化剂创建架构无法连接,但我可以 - Cache One

mysql - 根据修改后的列对Mysql结果进行排序 - Cache One

mysql - Perl + POO和Mysql错误 - Cache One

mysql - Perl DBI MySQL更新 - Cache One

mysql - 无法执行SQL查询 - Cache One

mysql - 无法找出Perl DBI中的占位符 - Cache One

mysql - Perl和DBI-加载数组问题 - Cache One

深入正则表达式(三) - Cache One

Learning Perl: 9.5. More Powerful Regular Expressions - Cache One

css - 缩小器无法识别回车 - Cache One

perl - 将 500 多个文件的名称从 Unicode U+0600 转换为文本 - Cache One

perl - 重击 : cpan: command not found - Cache One

perl - 本地化$ 0后显示原始args - Cache One

perl - PayPal自适应付款SetPaymentOptions-是否有效? - Cache One

Perl LWP:为什么 IO::Socket::SSL 使用 TLS 1.0,而 Net::SSL 使用 TLS 1.2? - Cache One

perl - PERL Get_Server_Certificate证书验证失败错误 - Cache One

perl - IO::Socket:SSL 在套接字上打印时有时会添加换行符 - Cache One

  • 8
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值