【C++】文件的输入与输出

/*详细的C++文件输入与输出流程,记录在使用C++进行文件操作时应注意的事项,避免后续出现麻烦。*/

文件的概念

文件是存储在外存储器中的数据集合。程序运行时可以从文件获取信息,而不一定是从键盘输入。

C++将文件看成一串流程的数据,称为数据流。

从外围设备流入程序的数据称为输入流(比如文件输入程序当中,即为输入流);从程序流向外围设备的数据称为输出流(比如程序输出到文件当中,即为输出流)。

每个数据流为一个对象。比如键盘流入程序的数据流,我们用一个对象cin作为代表。而程序流到显示器的数据流,我们用一个对象cou作为代表。

文本文件

在文件里最简单的文件是ASCII文件,也叫作文本文件。

所谓文本文件,每一个字节都是一个合法的ASCII字符。(因此可以直接显示在显示器上)

C++将控制台输入输出看成一个文本文件。

回顾iostream头文件

从控制台读

cin>>x;(cin这个对象代表的是键盘到程序的输入流)

cin是一个istream类的对象

写控制台

cout<

cout是一个ostream类的对象

istream和ostream都定义在头文件iostream中

新的头文件fstream

fstream包括:ifstream、ofstream和fstream三个类。

读文件

需要一个ifstream类的对象

写文件

需要一个ofstream类的对象

读写文件

需要一个fstream类的对象

文件操作

定义一个文件流对象        

如:

ofstream fout;

将对象与被访问的文件关联起来

fout.open("file1");

char string[20]="file1";

fout.open(string);

文件读写

将文件流对象当cin、cout一样使用

如:

fout<

关闭文件

文件使用结束,切断流对象与文件的关系。

fout.close();

写文件实例

代码段

#include 
#include                 

int main()
{
    using namespace std;

    char automobile[50];
    int year;
    double a_price;
    double d_price;

    ofstream outFile;               // 定义文件流对象 
    outFile.open("carinfo.txt");    // 建立关联关系 

    cout << "Enter the make and model of automobile: ";
    cin.getline(automobile, 50);
    cout << "Enter the model year: ";
    cin >> year;
    cout << "Enter the original asking price: ";
    cin >> a_price;
    d_price = 0.913 * a_price;
    
    //在显示器上显示 
    cout << fixed;                   //用一般的方式输出浮点型,例如C++程序在控制台显示的时候大一点的数,显示的时候使用了科学计数法,使用该命令即可像一般的方式显示
    cout.precision(2);              //设置精确度为2,并返回上一次的设置。
    cout.setf(ios_base::showpoint); //显示浮点数小数点后面的零。
    cout << "Make and model: " << automobile << endl;
    cout << "Year: " << year << endl;
    cout << "Was asking $" << a_price << endl;
    cout << "Now asking $" << d_price << endl;
    
    //把显示器上的数据输入到text文件当中去 
    outFile << fixed;                  //用一般的方式输出浮点型,例如C++程序在控制台显示的时候大一点的数,显示的时候使用了科学计数法,使用该命令即可像一般的方式显示
    outFile.precision(2);             //设置精确度为2,并返回上一次的设置。
    outFile.setf(ios_base::showpoint);//显示浮点数小数点后面的零。
    outFile << "Make and model: " << automobile << endl;
    outFile << "Year: " << year << endl;
    outFile << "Was asking $" << a_price << endl;
    outFile << "Now asking $" << d_price << endl;
    
    //关闭文件 
    outFile.close();            
    return 0;
}

运行

显示器输出

【C++】文件的输入与输出_第1张图片

同时在所在目录下出现了一个名为carinfo.text的文本文件。

carinfo.text中的数据

【C++】文件的输入与输出_第2张图片

因此,写文件会当通文件目录下没有该名字的文件时会新建一个同名文件,并出现在同一目录下。

应熟悉fout<<等这种数据流输入输出方法。

注意下面这段代码

cout << fixed;
cout.precision(2);
cout.setf(ios_base::showpoint);

cout<

cout.precision的作用: 设置精确度为2,并返回上一次的设置。

cout.setf(iOS_base::showpoint)的作用:显示浮点数小数点后面的零。

读文件实例

 从文件中读取一组实数,计算总和与均值。

代码段

#include 
#include          
#include           
const int SIZE = 60;
int main()
{
    using namespace std;
    char filename[SIZE];
    ifstream inFile;        //定义文件流对象 

    cout << "Enter name of data file: ";
    cin.getline(filename, SIZE);
    inFile.open(filename);  // 将对象与文件关联 
    if (!inFile.is_open())  // 用inFile.open()函数检查文件是否存在,存在返回true,不存在返回false。 
    {
        cout << "Could not open the file " << filename << endl;
        cout << "Program terminating.\n";
        exit(EXIT_FAILURE);
    }
    double value;
    double sum = 0.0;
    int count = 0;          // 计数

    inFile >> value;        // 从文件中读入数据 
    while (inFile.good())   // inFile.good()函数能判断刚刚读入的数据操作是否成功,成功返回true
    {
        ++count;            
        sum += value;       
        inFile >> value;    
    }
    if (inFile.eof())          //读到文件结束,inFile.eof返回true 
        cout << "End of file reached.\n";
    else if (inFile.fail())   // 读到非法数据,比如a,b,c,!等非实数的非法数据,读到则inFile.fail()返回true 
        cout << "Input terminated by data mismatch.\n";
    else                      //其他错误 
        cout << "Input terminated for unknown reason.\n";
    if (count == 0)         //检查是否读到数据 
        cout << "No data processed.\n";
    else
    {
        cout << "Items read: " << count << endl;
        cout << "Sum: " << sum << endl;
        cout << "Average: " << sum / count << endl;
    }
    //关闭文件 
    inFile.close();         
    return 0;
}

同目录下的scores.txt文件

635553d9997a4838b876b485a808fde3.png

输出

 【C++】文件的输入与输出_第3张图片

 当同一目录下没有同名文件时,inFile.open()函数会返回false,显示打开文件失败。所以要读的文件必须存在与磁盘当中。而如果不再同一目录,应输入该文件的路径。比如当我把scores.txt文件放在D盘的Git文件内当中时,我可以这样输入,结果和之前是一样的。

【C++】文件的输入与输出_第4张图片

文件不在同一目录下时,应该输入文件的路径,读写都是同样道理。

总结

这篇笔记记下了C++下文件的输入与输出的详细操作,跟C语言有许多不同之处,比如引入的“数据流”概念。另外特别需要注意的是,读、写文件中新出现的函数。

写文件要注意的几个新函数:cout<

这三个的作用是规范fout输出的格式,应特别注意

读文件要注意的几个新函数:inFile.open()、inFile.fail()、inFile.eof()。

 这三个函数的作用是判断文件的读入是否成功、读入的数据正确性、是否读到文件结束EOF符。

 

你可能感兴趣的:(c++,开发语言)