fstream文件流

Aki 发布于 2022-11-08 261 次阅读


  下图展示了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() 关闭文件。

以上就是基础的东西,还要更加深,进阶的东西在下面的这两篇文章里。。。。。。

C++文件流浅析 - 哔哩哔哩 (bilibili.com)

C++文件流读写操作详解_C 语言_脚本之家 (jb51.net)