C++ Primer 第五版 第8章类 8.2——文件输入和输出

目录

8.2 文件输入和输出

fstream头文件

fstream特有的操作

输出文件(写入文件)

输入文件(读取文件)

成员函数open和close

流状态检查和is_open()

文件模式

程序实例


8.2 文件输入和输出

fstream头文件

头文件fstream定义了三个类型来支持文件IO:(1)ifstream从一个给定文件读取数据;(2)ofstream向一个给定文件写入数据;(3)fstream可以读写给定文件


fstream特有的操作

                                                                                     fstream特有的操作

fstream fstrm

创建一个未绑定的文件流

fstream fstrm(s)

创建一个fstream,并打开名为s的文件。默认的文件模式mode依赖于fstream的类型

fstream fstrm(s,mode)

与前一个构造函数类似,但按指定mode打开文件

fstrm.open(s)

打开名为s的文件,并将文件与fstrm绑定,默认的文件mode依赖于fstream的类型,返回void

fstrm.close()

关闭与fstrm绑定的文件,返回void

fstrm.is_open()

返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭


输出文件(写入文件)

 写入文件的一般步骤:

(1)创建一个ofstream对象流,对象流都会定义一个open成员函数;

(2)将该对象与特定的文件关联起来,即关联一个文件:

(3)以使用cout的方式使用该对象流,唯一区别是输出将进入文件,而不是屏幕;

如下例子创建对象流和关联文件:

第一种方式,创建对象流时就关联文件,open函数会被自动调用:

ofstream out(file);   //自动调用open函数将out对象流和file关联起来

第二种方式,创建空对象流,调用open函数关联文件:

ofstream out;     //创建空对象流out
out.open(file);   //调用open函数关联file文件

小贴士!!!

默认模式打开文件进行输出将自动打开文件的长度截为零,即删除已有内容。 (细节!!


输入文件(读取文件)

读取文件的一般步骤:

(1)创建一个ifstream对象流,对象流都会定义一个open成员函数;

(2)将该对象与特定的文件关联起来,即关联一个文件;

(3)以使用cin的方式使用该对象流;

如下例子创建对象流和关联文件:

第一种方式,创建对象流时就关联文件,open函数会被自动调用(文件名初始化文件流对象):

ifstream in(file);   //自动调用open函数将in对象流和file关联起来

第二种方式,创建空对象流,调用open函数关联文件:

ifstream in;     //创建空对象流in
in.open(file);   //调用open函数关联file文件

成员函数open和close

对象流都有一个open和close成员函数,

open用来打开某个文件,将文件流和文件关联起来

close用来断开对象流和文件的关联。如果一个文件流想要关联另一个文件,则需要先断开已经关联的文件,如:

ifstream in;     //创建空对象流in
in.open(file);   //调用open函数关联file文件
in.close();      // 关闭文件
in.open(ifile+"2")  // 打开另一个文件

流状态检查和is_open()

打开文件时,对open状态是否成功检查是一个好习惯,有时候可能调用open失败,较新的c++检查文件是否被打开的方法——is_open()方法

以前检查文件是否被成功打开的方式(尽量用is_open):

(1)if(in.fail())...

(2)if(!in.good())...

(3)if(!in)...


文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件,下表列出了文件模式及其含义:

                                                 文件模式

in

读方式打开

out

写方式打开

app

每次写操作前均定位到文件末尾

ate

打开文件后立即定位到文件末尾

trunc

截断文件

binary

二进制方式进行IO 

 

打开模式示意图

 


程序实例

下边是实现一个程序,完成输入和输出操作,程序主要功能:

(1)首先显示文件当前内容(如果有的话)

(2)程序以app模式打开,进行写操作

(3)程序进行读操作,显示文件内容

# include<iostream>
# include<fstream>
# include<string>
using namespace std;

int main()
{
    //读取初始文件内容,并输出显示
    ifstream in;
    in.open("guest.txt");
    char ch;
    if (in.is_open())
    {
        cout << "Here are the current contents of thepeople.text's file:" <<endl;
        while (in.get(ch))
            cout << ch;
        cout << endl;
        in.close();

    }

    // 添加内容到文件
    ofstream out;
    out.open("D:guest.txt", ofstream::app);  //out.open("people.txt", ios_base::app);
    if (!out.is_open())
    {
        cout << "failed to open file" << endl;
    }
    cout << "Please enter content:";
    string str;
    while (getline(cin, str) && str.size() > 0)
    {
        out << "\n"<<str << endl;
    }
    out.close();
    

    //读取修改后的文件内容,并输出显示
    in.open("guest.txt");
    if (in.is_open())
    {
        cout << "Here are the revised contents of the people.text's file:" << endl;
        while (in.get(ch))
            cout << ch;
        cout << endl;
        in.close();
    }

    return 0;

}

第一次运行,因为不存在guest.txt文件,所以读取失败,直接进行写操作和输出操作 

第二次运行,文件已经存在,则进行读-写-读操作

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值