下图展示了C++的I/O类库的组成和继承关系:

可以看到,对于文件操作,C++从标准输出流istream中派生出了文件输入流ifstream,从标准输入流ostream中派生出了文件输入流ofstream,标准输入/输出流iostream多重继承了istream和ostream,而后又派生出了文件输入/输出流fstream,这意味着fstream同时具有ifstream和ofstream的一些属性和方法。cin、cout、cerr是标准I/O流提供的实例化,对运算符“<<”和“>>”有着丰富的重载,文件流对象也不例外,这意味着通过ifstream创建的文件输入流对象可以优雅地使用“>>”,就像“cin >> myStr”一样;通过ofstream创建的文件输出流对象可以优雅地使用“<<”,就像“cout << endl”一样;而通过fstream创建的文件流对象则既可以使用“<<”,也可以使用“>>”。
如何使用、
fstream定义在头文件 fstream 中,使用前需要引入头文件。fstream 是一个类对象,有构造函数和一系列的成员函数。
fstream 有三种类型,如下所示:
#include <fstream>
ofstream //写入方式打开文件,内存写入存储设备
ifstream //只读方式打开文件,存储设备读区到内存中
fstream //读写操作打开文件,对打开的文件可进行读写操作
打开文件的方法:
fstream fs("test.txt", ios::in); //使用构造函数的形式在创建fstream流对象时指定打开的文件和打开模式
fstream fs;
fs.open("test.txt", ios::in); //创建流对象时不初始化,然后调用成员函数open()打开文件
参数都是一个字符串包含打开的文件名称,还有一个打开模式。
打开模式:
参数 | 含义 |
---|---|
ios::in | 为输入(读)而打开文件 |
ios::out | 为输出(写)而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 所有输出附加在文件末尾 |
ios::trunc | 如果文件已存在则先删除该文件再重新创建 |
ios::binary | 二进制方式 |
可以使用多个打开模式,之间使用 | 分开,如 fstream fs("test.txt", ios::out |ios::app)
文件打开是否成功:
文件也是一种资源,在打开时可能会失败,特别注意打开一个不存在的文件时。需要判断文件是否打开成功,使用成员函数 is_open() 来判断。如果打开文件成功 is_open() 返回true,否则返回false。
fstream fs("test.txt", ios::out |ios::app)
if(fs.is_open()){} //判断
读取文件:
使用成员函数get()或者getline()来读取文件中的内容。getline()是一次读取一整行字符,get()是一次读取一个字符。
EOF (end of file)指的是文件的结尾。eof() 成员函数用于判断文件是否读取到了末尾,eof() 刚开始返回的值是0,直到文件尾才返回真。
打开一个文件时,实际上有一个指针指向了文件的开头第一个字符,在读取的过程中,这个指针不断向下移动指向下一个字符,最终移动到文件末尾,也就是EOF处。
按行读取文件:
fstream fs("123.txt", ios::in);
if (fs.is_open())
{
char tmp[256];
while (!fs.eof())
{
fs.getline(tmp, 256, '\n'); //表示该行字符达到256个或碰到换行就结束
puts(tmp);
}
}
fs.close();
按字符读取文件:
fstream fs("123.txt", ios::in);
if (fs.is_open())
{
char tmp;
while (!fs.eof())
{
tmp = fs.get();
cout << tmp;
}
}
fs.close();
写入文件、
使用 >> 或者 << 来写入文件:
fstream fs("test.txt", ios::out | ios::app); //这里是追加模式,把文件指针指向了文件末尾
if (fs.is_open())
{
fs << "hello,world";
}
fs.close();
假设test文件的内容最开始是 123456789,执行写入后变成 123456789hello,world
关闭文件、
文件也是一种资源,使用完毕后需要关闭,使用成员函数 close() 关闭文件。
以上就是基础的东西,还要更加深,进阶的东西在下面的这两篇文章里。。。。。。
Comments NOTHING