C++学习笔记(三十八) fstream read write

1 fstream 可以进行读写操作

2 fstream有两个指针,一个读 一个写

 移动文件读指针 fstream.seekg(int pos,ios::begin); 相对位置默认是开头 可以不写 (p -put)

 移动文件写指针  fstream.seekp(int pos,ios::begin);  (g -get)

2013-5-5

本来按我的理解fstream是有两个指针,但做了下实验又不是

因为我在使用seekp()之后 发现tellg()返回值是我设置的这个.

再加上write之后我发现tellg 和 tellp此时的值一样,

所以fstream是只有一个指针的,tellp和tellg的返回值其实是同一个东西.


经实验得出

seekp() 和 seekg()的效果是相同的

tellp()和tellg()的效果是相同的 



3 gcount()函数依然有效,记录实际读取数量





#include <iostream>
#include <fstream>
using namespace std;
#include <cstring>

void encode (char *buf ,int bytes)
{
	for(int i =0;i < bytes;i++)
	{
		++ *buf;
		buf++;	
		//注意  *buf++   ++的优先级比*高
	}
}

void decode (char* buf,int bytes)
{
	for(int i = 0;i < bytes; i++)
	{
		-- *buf;
		buf ++;
	}
}


int main(int agrc,char *argv[])
{
	//a.out 源文件  新文件
	if( agrc != 3 ||  strcmp(argv[1],"-e")  && strcmp(argv[1],"-d") )
	{
		cout << argv[0] << " -e|-d 文件路径" << endl;
		return 0;
	}
	
	
	fstream f1(argv[2],ios::binary| ios::in |ios::out);
	if(!f1)
	{
			cout << "打开文件失败" << endl;
			return 1;
	}
	
	bool buf[128];

	int pos1 = 0,pos2 = 0; //int 最多2G 
	bool end = false;
	void (*pf)(char *,int) = argv[1][1]=='e' ? encode:decode ;
	while(f1)
	{
		f1.seekg(pos1); //f1.seekg(pos1,ios::begin);
		f1.read( (char *)buf, sizeof(buf) ); //如果读到文件末尾 会出错 
		if(!f1)
		{
			f1.clear();
			end = true;
		}
		
		pos2 = f1.tellg();
		
		pf((char*)buf,f1.gcount());
		f1.seekp(pos1); //f1.seekp(-bytes,ios::cur);
		cout.write((char*)buf,f1.gcount());
		f1.write( (char*)buf, f1.gcount() );
		pos1 = pos2;
		
		if(end) break;
	}	
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值