C++文件读写
文件的使用步骤如下:
1.说明一个文件流对象,这又被称为内部文件:
ifstream ifile; //只输入用
ofstream ofile; //只输出用
fstream iofile; //既输入又输出用
2.使用文件流对象的成员函数打开一个磁盘文件。这样文件流对象和磁盘文件名之间建立联系。文件流中说明了三个打开文件的成员函数。
void ifstream::open(const char*, int=ios::in, int=filebuf::openprot);
void ofstream::open(const char*, int=ios::out, int=filebuf::openport);
void fstream::open(const char*, int, int=filebuf::openport);
第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(in),输出(out)等,打开方式在ios基类中定义为枚举类型。第三个参数为指定打开文件的保护方式,一般取缺省。
所以第二部可如下进行:
iofile.open("TEST.txt", ios::in | ios::out);
打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功则为0(NULL),文件流对象值物理上就是指它的地址。
因此打开一个文件完整的程序为:
fstream iofile("TEST.txt", ios::in | ios::out);
if(!iofile)
{
cout<<"打开文件失败!"<<"TEST.txt"<<endl;
exit(1);//失败退回操作系统
}
3.使用提取和插入运算符对文件进行读写操作,或者使用成员函数进行读写。
4.关闭文件。三个文件流类各有一个关闭文件的成员函数。
void ifstrean::close();
void ofstream::close();
void fstream::close();
文件打开过程示例代码如下
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
int ar[] = {65,66,67,68,69,1134688,71,70,73,74}, br[10];
ofstream ofile;//①
ofile.open("TEST.txt", ios::out);//②
if(!ofile)
{
cerr<<"Open File Fail."<<endl;
exit(1);
}
for(int t=0; t<sizeof(ar)/sizeof(int); ++t)//③
ofile<<ar[t]<<" ";//向文件内写入
ofile.close();//④
ifstream ifile;
ifile.open("TEST.txt", ios::in);
if(!ifile)
{
cerr<<"Open File Fail."<<endl;
exit(1);
}
for(int t=0; t<10; ++t)
ifile>>br[t];//从文件内读出并写入br中
ifile.close();
}
查看是否生成文件TEST.txt和br[10]内是否有数据
文件打开方式是在ios类中定义的,公有枚举成员:
使用方式与格式控制符相同。
在C++中可以又程序移动文件指针,从而实现文件的随机访问,即可读写流中任意一段内容。一般文件很难准确定位,所以随机访问多用于二进制文件。
在ios类中说明了一个公有枚举类型:
enum seek_dir { beg=0,//文件开头 cur=1,//文件指针的当前位置 end=2//文件结尾 }
#include<iostream> #include<fstream> using namespace std; void main() { int ar[] = {65,66,67,68,69,70,71,70,73,74}, br[10], pos,value; ofstream ofile; ofile.open("TEST.txt", ios::out); if(!ofile) { cerr<<"Open File Fail."<<endl; exit(1); } for(int i=0; i<sizeof(ar)/sizeof(int); ++i) ofile<<ar[i]<<" "; ofile.close(); ifstream ifile; ifile.open("TEST.txt", ios::in); if(!ifile) { cerr<<"Open File Fail."<<endl; exit(1); } while(1) { cout<<"input pos = "; cin>>pos; ifile.seekg(3*pos, ios::beg); ifile>>value; cout<<value<<endl; } ifile.close(); }
运行结果
不积小流无以成江河