C++基础:文件读写

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::opernprot);


void fstream::open(const char*,int,int=filebuf::openprot); 

第一个参数为要打开的磁盘文件名。
第二个参数为打开方式,有输入(in),输出(out)等,打开方式在ios基类中定义为枚举类型。
第三个参数为指定打开文件的保护方式,一般取缺省。

所以第二步可如下进行:
iofile.open(“myfile.txt”,ios::in|ios::out);
所以1,2两步可合成:
fstream iofile(“myfile.txt”,ios::in|ios::out);

打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),
文件流对象值物理上就是指它的地址。
因此打开一个文件完整的程序为:

fstream iofile(”myfile.txt”,ios::in|ios::out);
if(!iofile)
{
cout<<”不能打开文件:”<<”myfile,txt”<<endl;
exit(1);   //失败退回操作系统


3.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写。

4.关闭文件。三个文件流类各有一个关闭文件的成员函数 

void ifstream::close();

void ofstream::close();

void fstream::close();

使用很方便,
如: iofile.close();

关闭文件时,系统把该文件相关联的文件缓冲区中的数据写到文件中,保证文件的完整,
收回与该文件相关的内存空间,可供再分配,把磁盘文件名与文件流对象之间的关联断开,
可防止误操作修改了磁盘文件。如又要对文件操作必须重新打开。
    
关闭文件并没有取消文件流对象,该文件流对象又可与其他磁盘文件建立联系。
文件流对象在程序结束时,或它的生命期结束时,由析构函数撤消。它同时释放内部分配的预留缓冲区。  

文本文件的读写:

这里讨论文本文件的顺序读写。顺序读写可用C++的提取运算符(>>)和插入运算符(<<)进行。

<span style="font-size:18px;">#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

//1.文本方式写
void main()
{
	int ar[] = {12,23,34,45,56,67,78,90,100};

	ofstream ofile;                                    //1.定义文件流对象

	ofile.open("Test1.txt",ios::out);                  //2.打开文件 
	if(!ofile)
	{

		cout<<"不能打开文件:"<<"Test.txt"<<endl;

		exit(1);   
	} 


	for(int i = 0; i < sizeof(ar)/sizeof(int); ++i)   //3.对文件进行写操作
	{
		ofile<<ar[i]<<" ";
	}

	ofile.close();                                     //4.关闭文件流对象
}
//2.文本方式读
void main()
{
	int ar[10];

	fstream ifile;               
           
	ifile.open("Test1.txt",ios::in);                
	if(!ifile)
	{

		cout<<"不能打开文件:"<<"Test1.txt"<<endl;

		exit(1);   
	} 


	for(int i = 0; i < sizeof(ar)/sizeof(int); ++i) 
	{
		ifile>>ar[i]>>" ";
	}

	ifile.close();                            
}</span>

二进制文件的读写:

C++提供了对二进制文件进行读写的成员函数:

istream&istream::read(char *,int); //从二进制流提取

istream&istream::read(unsigned char*,int);

istream&istream::read(signed char *,int);
//第一个参数指定存放有效输入的变量地址
//第二个参数指定提取的字节数,
//函数从输入流提供指定数量的字节送到指定地址开始的单元

ostream&ostream::write(const char *,int);//向二进制流插入

ostream&ostream::write(const unsigned char *,int);
ostream&ostream::write(const signed char *,int);
//第一个参数指定输出对象的内存地址,
//第二个参数指定插入的字节数,
//函数从该地址开始将指定数量的字节插入输入输出流

读函数并不能知道文件是否结束,可用状态函数int ios::eof()来判断文件是否结束。
必须指出系统是根据当前操作的实际情况设置状态位,如需根据状态位来判断下一步的操作,
必须在一次操作后立即去调取状态位,以判断本次操作是否有效。
使用二进制文件,可以控制字节长度,读写数据时不会出现二义性,可靠性高。
同时不知格式是无法读取的,保密性好。文件结束后,系统不会再读(见eofbit的说明),
但程序不会自动停下来,所以要判断文件中是否已没有数据。
如写完数据后没有关闭文件,直接开始读,则必须把文件定位指针移到文件头。
如关闭文件后重新打开,文件定位指针就在文件头。

<span style="font-size:18px;">//3.二进制写
void main()
{
	int ar[] = {12,23,34,45,56,67,78,90,100};

	ofstream ofile;             
                   
	ofile.open("Test2.txt",ios::out | ios::binary);               
	if(!ofile)
	{

		cout<<"不能打开文件:"<<"Test2.txt"<<endl;

		exit(1);   
	} 
	
	ofile.write((char *)ar,sizeof(ar));

	ofile.close();                         
}


//4.二进制读
void main()
{
	int ar[10];

	ifstream ifile;                                

	ifile.open("Test2.txt",ios::in | ios::binary);               
	if(!ifile)
	{

		cout<<"不能打开文件:"<<"Test2.txt"<<endl;

		exit(1);   
	} 
	
	ifile.read((char *)ar,sizeof(ar));

	ifile.close();                         
}</span>

文件的随机访问:

当打开一个文件时,该文件就和某个流关联起来了。对文件进行读写实际上受到一个文件定位指针的控制。
输入流的指针也称为读指针,每一次提取操作将从读指针当前所指位置开始,每次提取操作自动将读指针向文件尾移动。
输出流指针也称写指针,每一次插入操作将从写指针当前位置开始,每次插入操作自动将写指针向文件尾移动。

在C++中可以由程序移动文件指针,从而实现文件的随机访问,即可读写流中任意一段内容。
一般文本文件很难准确定位,所以随机访问多用于二进制文件。
在ios类中说明了一个公有枚举类型:
enum seek_dir
{
beg=0, //文件开头

cur=1, //文件指针的当前位置

end=2 //文件结尾

};

istream类中提供了如下三个成员函数:

istream&istream::seekg(streampos); //指针直接定位

istream&istream::seekg(streamoff, ios::seek_dir); //指针相对定位

long istream::tellg(); //返回当前指针位置

流的指针位置类型streampos和流的指针偏移类型streamoff定义为长整型,也就是可访问文件的最大长度为4G

例:datafile.seekg(-20L,ios::cur);

表示将文件定位指针从当前位置向文件头部方向移20个字节。

datafile.seekg(20L,ios::beg);

表示将文件定位指针从文件头向文件尾方向移20个字节。

datafile.seekg(-20L,ios::end);

表示将文件定位指针从文件尾向文件头方向移20个字节。

tellg()和seekg()往往配合使用。

指针不可移到文件头之前或文件尾之后。
ostream类也提供了三个成员函数管理文件定位指针,它们是:

ostream&ostream::seekp(streampos);

ostream&ostream::seekp(streamoff,ios::seek_dir);

long ostream::tellp();

为了便于记忆,函数名中g是get的缩写,而p是put的缩写。
对输入输出文件定位指针只有一个但函数有两个,这两个函数功能完全一样。

文件的随机访问:

<span style="font-size:18px;">void main()
{

	fstream ifile;                        
	ifile.open("Test1.txt",ios::in);                
	if(!ifile)
	{

		cout<<"不能打开文件:"<<"Test1.txt"<<endl;

		exit(1);   
	} 


	int pos;
	while(1)
	{
		cout<<"请输入位置:";
		cin>>pos;
		ifile.seekg(pos*3,ios::beg);  //定位到文件起始位置的第pos位,每次移动3个字节
		ifile>>value;
		cout<<"value = "<<value<<endl;

	}

	ifile.close();                            
}
</span>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值