C++ ➢ 简单文件输入/输出

本文介绍了C++中如何进行文本文件的输入和输出,包括使用cin和cout进行文本读写,以及如何处理不同数据类型的转换。通过示例代码详细阐述了写入文本文件和读取文本文件的步骤,同时对比了cout与文件写入、cin与文件读取的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C++提供了一系列的方法,使得将读取键盘输入和在屏幕上显示输出(统称为控制台输入/输出)的技巧用于文件输入/输出(文件I/O)非常简单,具体如下文:

文本I/O和文本文件

使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。
也就是说——不管目标的数据类型是什么,输入一开始都是字符数据——文本数据。然后,cin对象负责将文本转换为其他类型。
看以下几种情况:

// 输入为字符时
	char ch;  
	cin >> ch;

这种情况下,输入行为:38.5
输入和目标变量都是字符,因此不需要转换。
需要注意的是:
①这里存储的3,是字符3的编码
②执行完上述语句后,输入队列的下一个字符为字符8,下一个输入操作将对其进行处理

// 输入为int类型时
    int n;
    cin >> n;

这种情况下,cin将不断读取,直到遇到非数字字符。
它读取3和8,并将句点留在队列中。cin通过计算发现,这两个字符对应数值38,因此将38的二进制编码复制到变量中。

// 输入为int类型时
    double x;
    cin >> x;

这种情况下,cin将不断读取,直到遇到不属于浮点数的字符。即空格。
cin通过计算发现,这四个字符对应于数值38.5,因此将38.5的二进制编码复制到变量x中。

// 输入为int类型时
    char word[50];
    cin >> word;

这种情况下,cin将不断读取,直到遇到空白字符。不需要进行任何转换。
cin将字符的字符编码存储到数组中,并在句末加上一个空字符。

// 输入为int类型时
    char word[50];
    cin.getline(word,50);

这种情况下,cin将不断读取,直到遇到换行符。所有字符都被存储到word中,并在末尾加一个空字符。
换行符被丢弃(不留在队列中),输入队列的下一个字符是下一行中的第一个字符。

写入文本文件

先看一段代码:

// 输入为int类型时
#include <iostream>
#include <fstream>       //for file I/O
using namespace std;

	int main()
{
    char automobile[50];
    int year;
    double a_price;
    double d_price;

    ofstream outFile;               //create object for output
    outFile.open("carinfo.txt");    //associate with a file

    cout << "Enter the make and model of automoblie: ";
    cin.getline(automobile,50);
    cout << "Enter the model year: ";
    cin >> year;
    cout << "Enter the oringinal asking price: ";
    cin >> a_price;
    d_price = a_price * 0.913;

//  display information on screen with cout
    cout << fixed;
    cout.precision(2);
    cout.setf(ios_base::showpoint);
    cout << "Make and mode:" << automobile << endl;
    cout << "Year: " << year << endl;
    cout << "Was asking $: " << a_price << endl;
    cout << "Now asking $: " << d_price << endl;

//now do exact same things using outfile instead of cout
    outFile << fixed;
    outFile.precision(2);
    outFile.setf(ios_base::showpoint);
    outFile << "Make and mode:" << automobile << endl;
    outFile << "Year: " << year << endl;
    outFile << "Was asking $: " << a_price << endl;
    outFile << "Now asking $: " << d_price << endl;

    outFile.close();
    return 0;
}

在文件中的输出情况如图所示
在文件中的输出情况如图所示

使用文件输出的步骤可以总结如下:
1.包含头文件。
2.创建一个ofstream对象。
3.将该ofstream对象与一个文件关联起来。 (x.open())
4.像使用cout那样使用ofstream对象。

仍有一些小细节需要注意,在上述代码中出现:
1.cout << fixed;
说明用一般方式输出浮点型,即不使用指数表示法。
2.cout.precision(2);
设置浮点数的精度为2
3.cout.setf(ios_base::showpoint);
cout输出会自动省略掉小数点后无用的0,即输入38.00会显示38。
这个操作使得0不会被隐藏。

读取文本文件

先看一段代码:

// 输入为int类型时
#include <iostream>
#include <fstream>       //for file I/O
#include <cstdlib>       //support for exit();
const int SIZE = 60;
using namespace std;

int main()
{
    char filename[SIZE];

    ifstream inFile;                        //object for handling file input
    cout << "Enter name of data file: ";
    cin.getline(filename,SIZE);
    inFile.open(filename);                  //associate inFile with a file

    if(!inFile.is_open())                   //failed to open file
    {
        cout << "Could not open this file " << filename << endl;
        cout << "Program terminating.\n";
        exit(EXIT_FAILURE);
    }

    double value;
    double sum = 0.0;
    int count = 0;                          //number of items read

    inFile >> value;                        //get first value from File
    while(inFile.good())                    //while input good and not at EOF
    {
        ++count;                            //on more item read
        sum += value;                       //calculate running total
        inFile >> value;                    //get next value
    }

    if(inFile.eof())
        cout << "End of file reached." << endl;
    else if(inFile.fail())
        cout << "Input terminated by data mismatch." << endl;
    else
        cout << "Input terminated for unknown reason." << endl;

    if(count == 0)
        cout << "No data processed." << endl;
    else
    {
        cout << "Item read: " << count << endl;
        cout << "Sum: " << sum << endl;
        cout << "Average: " << sum/count << endl;
    }
    inFile.close();

    return 0;
}

读取的文件中需要先输入以下内容:
读取的数据如上
使用文件读取的步骤可以总结如下:
1.包含头文件。
2.创建一个ifstream对象。
3.将该ifstream对象与一个文件关联起来。 (x.open())
4.像使用cin那样使用ifstream对象。

仍有一些小细节需要注意:
读取文件时可能会出现的问题。有的文本编辑器不会自动在最后一行末尾加上换行符,
所以请在输入最后的文本后按下回车,再保存文件。确保读取正确。

总结

cout与文件写入的对比

cout文件写入
必须包含头文件 iostream必须包含头文件 fstream
头文件定义了一个用来处理输出的 ostream 类头文件定义了一个用来处理输出的 ofstream 类
头文件声明了一个名为 cout 的 ostream 变量(对象)头文件声明一个或多个 ofstream 变量(对象),并以自己喜欢的方式对其进行命名
必须指明名称空间 std;例 std::cout必须指明名称空间 std;例 std::(ofstream 变量)
结合使用 cout 和 << 来显示各种类型的数据结合使用 ofstream 对象和 << 来显示各种类型的数据
无须关联需要将 ofstream 与文件关联起来—— open(),使用完后用close()关闭

cin与文件读取的对比

cin文件读取
头文件 iostream头文件 fstream
处理输入的 istream 类处理输入的 ifstream 类
头文件声明了一个名为 cin的 istream 变量(对象)头文件声明一个或多个 ifstream 变量(对象),并以自己喜欢的方式对其进行命名
必须指明名称空间 std;例 std::cin必须指明名称空间 std;例 std::(ifstream 变量)
结合使用 cin 和 >> 来显示各种类型的数据结合使用 ifstream 对象和 >> 来显示各种类型的数据
无须关联需要将 ifstream 与文件关联起来—— open(),使用完后用close()关闭
使用 cin 和 get() 方法读取一个字符,使用 cin 和 getline() 方法读取一行字符使用 ifstream 对象和 get() 方法读取一个字符,使用 ifstream 对象和 getline() 方法读取一行字符
结合使用 cin 和 eof()、fail() 方法来判断输入是否成功结合使用 ifstream 对象和 eof()、fail() 方法来判断输入是否成功
对象 cin 本身被用作测试条件时,如果最后一个读取操作成功,则被转换为布尔值 true,否则被转换为 falseifstream 对象本身被用作测试条件时,如果最后一个读取操作成功,则被转换为布尔值true,否则被转换为false

资料参考 C++ Primer Plus (第六版)中文版,仅学习使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值