最近多次遇到读取文件的库函数,在此做个记录,主要参考了几位大神的博文,以备复习之用
这里主要是讨论fstream的内容:
#include
ofstream //文件写操作,由内存写入设备中
ifstream //文件读操作,由存储设备读到内存中
fstream //读写操作,对打开的文件可以进行读写操作
1. 打开文件
在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作。
函数:open()
public member function
void open(const char* filename,ios_base::openmode mode = ios_base::in | ios_base::out);
void open(const w_char_t *_Filename,ios_base::openmode mode = ios_base::in | ios_base::out,int prot = ios_base::_Openprot);
参数:filename 操作文件名
mode 打开文件的方式
prot 打开文件的属性 //这个基本很少用到
打开文件的方式在ios类(所有流式I/O的基类)中定义,有如下几种方式:
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件尾部
ios::trunc 如果文件已存在则先删除文件
ios::binary 二进制文件
这些方式是能够进行组合的,以“或”运算的方式(‘|’),如:
ofstream out;
out.open("hello.txt",ios::in | ios::out | ios::binary)
很多程序中,可能碰到ofstream out("Hello.txt"), ifstream in("hello.txt"), fstream foi("hello.txt")这样的使用,并没有显示的去调用open()函数就可以进行文件的操作,这是因为调用了其默认的打开方式,因为在stream类的构造函数中调用了open()函数,并拥有同样的构造函数,所以在这里可以直接使用流对象进行文件的操作,默认方式如下:
ofstream out("hello.txt",ios::out);
ifstream in("hello.txt",ios::in);
fstream foi("hello.txt",ios::in | ios::out);
当使用默认方式进行文件的操作时,可以使用成员函数is_open()对文件是否打开进行验证。
2. 关闭文件
当文件读写操作完成后,必须将文件关闭以使文件重新变为可访问的。成员函数close(),它负责将缓存中的数据及时写入文件并关闭文件。这个函数一旦被调用,原先的流对象就可以被用来打开其他的文件了,这个文件也就可以重新被其他的进程所访问了。为防止流对象被销毁时还联系着打开的文件,析构函数也会自动调用关闭函数close().
3.文本文件的读写
类ofstream,ifstream和fstream是分别从ostream,istream,iostream类中继承来的。这就是为什么fstream对象可以使用其父类的成员来访问数据。
一般来说,我们将使用这些类与控制台交互同样的成员函数(cin,cout)来进行输入输出。如下面所示,可以使用重载的插入操作符<<:
//write on a text file
#include
int main()
{
ofstream out("out.txt");
if(out.is_open())
{
out<<"this is a line.\n";
out<<"This is another line.\n";
out.close();
}
return 0;
}
从文件中读入数据可以使用与cin>>相同的方法:
//reading a text file.
#include
#include
int main()
{
char buffer[256];
ifstream in("test.txt");
if(!in.is_open())
{
cout<<"Error while opening file.";
return 1;
}
while(!in.eof())
{
in.getline(buffer,256);
cout<
上面的例子读入一个文件文本的内容,然后将它打印到屏幕上。使用了一个新的成员函数eof(),它是ifstream从类ios中继承过来的,当达到文件末尾时返回true。