C++是一种使用非常广泛的计算机程式语言。C++是一种静态数据类型检查的、支持多重编程範式的通用程式设计语言。
基本介绍
- 中文名c++档案操作
- 属于非常广泛的计算机程式语言
- 支持多重编程範式
- 含义通用程式设计语言
举例说明
C++档案流
fstream // 档案流
ifstream // 输入档案流
ofstream // 输出档案流
//创建一个文本档案并写入信息
//同向萤幕上输出信息一样将信息输出至档案
#include<iomanip>
#include<fstream>
void main()
{
ofstream f1("d:\\me.txt"); //打开档案用于写,若档案不存在就创建它
if(!f1)return; //打开档案失败则结束运行
f1<<setw(20)<<"姓名"<<"张三"<<endl; //使用插入运算符写档案内容
f1<<setw(20)<<"家庭地址"<<"华盛顿"<<endl;
f1.close(); //关闭档案
}
运行后打开档案d:\me.txt,其内容如下
姓名张三
家庭地址华盛顿
档案操作
打开档案
档案名称
注意路径名中的斜槓要双写,如
"D:\\MyFiles\\ReadMe.txt"
档案打开方式选项
ios::in = 0x01, //供读,档案必须已经存在(ifstream默认的打开方式)
ios::out = 0x02, //供写,档案不存在则创建,若档案已存在则清空原内容(ofstream默认的打开方式)
ios::ate = 0x04, //档案不存在时,生成空档案;档案不存在,清空原档案(ofstream打开方式)。如果没有档案,打开失败;如果有档案,定位到档案尾,不能写档案(ifstream打开方式)。
ios::app = 0x08, //供写,档案不存在则创建,若档案已存在则在原档案内容后写入新的内容,指针位置总在
ios::trunc = 0x10, //在读写前先将档案长度截断为0(默认)
ios::nocreate = 0x20, //档案不存在时产生错误,常和in或app联合使用
ios::noreplace = 0x40, //档案存在时产生错误,常和out联合使用
ios::binary = 0x80 //二进制格式档案
注//新版本的c++标準,ios::noreplace和ios::nocreate已经无法使用
档案保护方式选择项
filebuf::openprot; //默认的兼容共享方式
filebuf::sh_none; //独占,不共享
filebuf::sh_read; //读共享
filebuf::sh_write; //写共享
以上方式仅旧版VC中支持,新版VC在share.h中为Win32项目定义了如下方式
_SH_DENYRW 0x10 / deny read/write mode/
_SH_DENYWR 0x20 / deny write mode /
_SH_DENYRD 0x30 / deny read mode /
_SH_DENYNO 0x40 / deny none mode /
_SH_SECURE 0x80 / secure mode /
示例fstream a_file("test.dat", ios::in | ios::binary, _SH_DENYRW);
此时使用其他程式打开test.dat将显示“此档案已被其他进程占用”
打开档案的方法
调用构造函式时指定档案名称和打开模式
ifstream f("d:\\12.txt",ios::nocreate); //默认以 ios::in 的方式打开档案,档案不存在时操作失败
ofstream f("d:\\12.txt"); //默认以 ios::out的方式打开档案
fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以读写方式打开二进制档案
使用Open成员函式
fstream f;
f.open("d:\\12.txt",ios::out); //利用同一对象对多个档案进行操作时要用到open函式
检查是否成功打开
成功
if(f){...} //对ifstream、ofstream对象可用,fstream对象不可用。
if(f.good()){...}
失败
if(!f){...} // !运算符已经重载
if(f.fail()){...}
读写操作
使用<<,>>运算符
只能进行文本档案的读写操作,用于二进制档案可能会产生错误。
使用函式成员 get、put、read、write等
ofstream的成员函式write从记忆体中的一个指定的位置开始输出固定数目的位元组到指定的流,当流被关联档案时,函式write在档案中从put档案定位指针指定的位置开始写入数据
ifstream的成员函式read将固定数目的位元组从一个指定的流输入到记忆体中指定地址开始的一部分空间中,若关联档案,read函式在档案中从get档案定位指针指定的位置开始读取数据
经常和read配合使用的函式是gcount(),用来获得实际读取的位元组数。
读写二进制档案注意事项
打开方式中必须指定ios::binary,否则读写会出错
用read\write进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。
使用eof()函式检测档案是否读结束,使用gcount()获得实际读取的位元组数
关闭档案
使用成员函式close,如
f.close();
利用析构函式
对象生命期结束时会检查档案是否关闭,对没有关闭的档案进行关闭操作。
随机读写档案
ifstream和ofstream都提供了成员函式来重定位档案定位指针(档案中下一个被读取或写入的位元组号)
在ifstream中 这个成员函式为seekg("seek get");在ofstream中为seekp("seek put")
seekg(绝对位置); //绝对移动, //输入流操作
seekg(相对位置,参照位置); //相对操作
tellg(); //返回当前指针位置
seekp(绝对位置); //绝对移动, //输出流操作
seekp(相对位置,参照位置); //相对操作
tellp()和tellg()成员函式分别用来返回当前get和put的指针位置
参照位置
ios::beg = 0 //相对于档案头
ios::cur = 1 //相对于当前位置
ios::end = 2 //相对于档案尾
读写文本档案的示例
//为能够正确读出写入档案的各数据,各数据间最好要有分隔
#include<fstream>
void main()
{
fstream f("d:\\try.txt",ios::out);
f<<1234<<' '<<3.14<<'A'<<"How are you"; //写入数据
f.close();
f.open("d:\\try.txt",ios::in);
int i;
double d;
char c;
char s[20];
f>>i>>d>>c; //读取数据
f.getline(s,20);
cout<<i<<endl; //显示各数据
cout<<d<<endl;
cout<<c<<endl;
cout<<s<<endl;
f.close();
}
运行结果
1234
3.14
A
How are you
Press any key to continue
显示文本档案的内容
//使用get()一次读一个位元组--------------------------------方案一
#include<fstream>
void main()
{
ifstream fin("d:\\简介.txt",ios::nocreate);
if(!fin){
cout<<"File open error!\n";
return;
}
char c;
while((c=fin.get())!=EOF)cout<<c; //注意结束条件的判断
fin.close();
}
//使用get(char ,int n,char delim='\n')一次读多个字元----方案二
//巧妙利用文本档案中不会有字元'\0'的特点进行读取
#include<fstream>
void main()
{
ifstream fin("d:\\简介.txt",ios::nocreate);
if(!fin){
cout<<"File open error!\n";
return;
}
char c[80];
while(fin.get(c,80,'\0')!=NULL)cout<<c; //注意结束条件的判断
fin.close();
}
//使用read(char ,int n)读档案---------------------------方案三
#include<fstream>
void main()
{
ifstream fin("d:\\简介.txt",ios::nocreate);
if(!fin){
cout<<"File open error!\n";
return;
}
char c[80];
while(!fin.eof()) //判断档案是否读结束
{
fin.read(c,80);
cout.write(c,fin.gcount());
}
fin.close();
}
拷贝档案
//二进制档案操作示例
#include<fstream>
void main()
{
ifstream fin("C:\\1.exe",ios::nocreate|ios::binary);
if(!fin){
cout<<"File open error!\n";
return;
}
ofstream fout("C:\\2.exe",ios::binary);
char c[1024];
while(!fin.eof())
{
fin.read(c,1024);
fout.write(c,fin.gcount());
}
fin.close();
fout.close();
cout<<"Copy over!\n";