定位读:
in.seekg(位置,ios::beg)//默认beg
ios:beg 文件头
ios:end 文件尾
ios:cur 当前位置
定位写:
out.seekp(位置,ios:beg)//默认beg
当前位置://相对于文件头的位置
.tellg()
.tellp()
in.seekg(位置,ios::beg)//默认beg
ios:beg 文件头
ios:end 文件尾
ios:cur 当前位置
定位写:
out.seekp(位置,ios:beg)//默认beg
当前位置://相对于文件头的位置
.tellg()
.tellp()
加解密:
#include <iostream>
#include <fstream>
using namespace std;
void encode(char*buf,int bytes)
{
for(int i=0;i<bytes;i++}
{
++*buf++;
}
}
void decode(char*buf,int bytes)
{
for(int i=0;i<bytes;i++}
{
--*buf++;
}
}
int main(0int argc,char*argv[])
{//用法a.out -e|-d 文件路径
if(argc!=3||strcmp(argv[1],"-e")&&strcmp(argv[1],"-d")){//&&优先级高些
cout << argv[0] << " -e|-d 文件" << endl;
return 0;
}
ifstream f1(argv[1],ios::binary|ios::in);//也可以ifstream f1(argv[1]);文本格式
//windows中 文本格式和二进制格式是不一样的 文本中会对回车换行符转换
//二进制中不会 一般是弄二进制格式
if(!f1)
{
cout << "打开" <<argv[1] <<"文件失败" <<endl;
return 1;
}
//又读又写fstream
bool bug[100];//字符数组也可以效果一样
void(*p)(char*,int) = argv[1][1] == 'e'?encode:decode;
int pos1=0,pos2;
bool ok = true;
while(ok)
{
f1.seekg(pos1);//f1.speekg(ios::beg);
f1.read((char*)buf,sizeof(buf); //char* 把bool转化为char*
if(!f1){
f1.claer();
ok = false;
}
else
pos2 = f1.tellg();
f2.tellg(); //取得位置
p((char*)buf,f1.gcount());
f1.seekp(pos1);//f1.seekp(-bytes,ios::cur);
f1.write((char*)buf,f1.gcount());
pos1 = pos2;
}
/*浪费用户时间
while(f1)
{
f1.read((char*)buf,sizeof(buf); //char* 把bool转化为char*
if(argv[1][1]=='e')
encode((char*)buf,f1.gcount());
else
decode((char*)buf,f1.gcount());
f2.write((char*)buf,f1.gcount());
}
*/
}