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++提供了对二进制文件进行读写的成员函数:
istream&istream::read(char *,int); //从二进制流提取
istream&istream::read(unsigned char*,int);
istream&istream::read(signed char *,int);
//第一个参数指定存放有效输入的变量地址
//第二个参数指定提取的字节数,
//函数从输入流提供指定数量的字节送到指定地址开始的单元
ostream&ostream::write(const char *,int);//向二进制流插入
文件的随机访问:
当打开一个文件时,该文件就和某个流关联起来了。对文件进行读写实际上受到一个文件定位指针的控制。
输入流的指针也称为读指针,每一次提取操作将从读指针当前所指位置开始,每次提取操作自动将读指针向文件尾移动。
输出流指针也称写指针,每一次插入操作将从写指针当前位置开始,每次插入操作自动将写指针向文件尾移动。
在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的缩写。
对输入输出文件定位指针只有一个但函数有两个,这两个函数功能完全一样。
文件的随机访问:
文件的使用步骤如下:
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>