❥关于C++之写入/读取文本文件
Posted itzyjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❥关于C++之写入/读取文本文件相关的知识,希望对你有一定的参考价值。
写入到文本文件
使用文件输出的主要步骤如下:
1.必须包含头文件<fstream>
。
2.头文件<fstream>定义了一个用于处理输出的ofstream
类。
3.需要声明一个或多个ofstream变量(对象),将ofstream对象与文件关联起来。方法之一是使用open()
方法。
4.使用完文件后,应使用方法close()
将其关闭。
5.可结合使用ofstream对象和运算符<<
来输出各种类型的数据。
#include <fstream> // for file I/O
#include <iostream>
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 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;
// display information on screen with cout
cout << fixed;
cout.precision(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;
// now do exact same things using outFile instead of cout
outFile << fixed;
outFile.precision(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(); // done with file
return 0;
Enter the make and model of automobile: |Flitz Perky<Enter>
Enter the model year: |2009<Enter>
Enter the original asking price: |13500<Enter>
Make and model: Flitz Perky
Year: 2009
Was asking $13500.00
Now asking $12325.50
在VS2019中,在可执行文件目录生成了一个名为carinfo.txt文件,内容如下:
注:该程序运行之前,文件carinfo.txt并不存在。在这种情况下,方法open()将新建一个名为carinfo.txt的文件。如果在此运行该程序,文件carinfo.txt已存在,默认情况下,open()将首先截断该文件,即将其长度截短到零——丢其原有的内容,然后将新的输出加入到该文件中。
读取文本文件
使用文件输入的主要步骤如下:
1.必须包含头文件<fstream>
。
2.头文件<fstream>定义了一个用于处理输入的ifstream
类。
3.需要声明一个或多个ifstream变量(对象),将ifstream对象与文件关联起来。方法之一是使用open()
方法。
4.使用完文件后,应使用close()
方法将其关闭。
5.可结合使用ifstream对象和运算符>>
来读取各种类型的数据。
另:
a.可以使用ifstream对象和get()方法来读取一个字符,使用ifstream对象和getline()来读取一行字符。
b.可以结合使用ifstream和eof()、fail()等方法来判断输入是否成功。
c.ifstream对象本身被用作测试条件时,如果最后一个读取操作成功,它将被转换为布尔值true,否则被转换为false。
#include <cstdlib> // support for exit()
#include <fstream> // file I/O support
#include <iostream>
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()) // failed to open file
cout << "Could not open the file " << filename << endl;
cout << "Program terminating.\\n";
// cin.get(); // keep window open
exit(EXIT_FAILURE);
double value;
double sum = 0.0;
int count = 0; // number of items read
inFile >> value; // get first value
while (inFile.good()) // while input good and not at EOF
++count;
sum += value;
inFile >> value; // get next value
if (inFile.eof())
cout << "End of file reached.\\n";
else if (inFile.fail())
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(); // finished with the file
return 0;
首先在VS2019可执行目录下新建一个名为scores.txt的文件,内容如下:
Enter name of data file: |scores.txt<Enter>
End of file reached.
Items read: 12
Sum: 204.5
Average: 17.0417
注:如果在scores.txt文件最后一行不输入[Enter]一个换行符,“17.5”这个数不会被统计和计算!
因为没有最后的换行符时读到“17.5”就到文件结尾了inFile.good()==false,达到EOF了。
如果首行“18”后面有N个空格,输出也是如上;
如果“18”后面空格用“#”号代替,输出结果如下:
Enter name of data file: |scores.txt<Enter>
Input terminated by data mismatch.
Items read: 1
Sum: 18
Average: 18
所以,对于ifstream>>value空白(空格,换行符,制表符)分隔符,读取时会提取并丢弃。
读取文件时,有几点需要检查:
首先,程序读取文件时不应超过EOF。如果最后一次读取数据时遇到EOF,方法eof()
将返回true。
其次,程序可能遇到类型不匹配的情况。例如,程序清单中期望文件中只包含数字。如果最后一次读取操作中发生了类型不匹配的情况,方法fail()
将返回true(如果遇到了EOF,该方法也将返回true)。
最后,可能出现意外的问题,如文件受损或硬件故障。如果最后一次读取文件时发生了这样的问题,方法bad()
将返回true。
不要分别检查这些情况,一种更简单的方法是使用good()
方法,该方法在没有发生任何错误时返回true,上面程序就是这样做的。
由于eof()只能判断是否到达EOF,而fail()可用于检查EOF和类型不匹配。因此上述代码首先判断是否到达EOF。这样,如果执行到了else if测试,便可排除EOF,因此,如果fail()返回true,便可断定导致循环终止的原因是类型不匹配。
其实,表达式inFile >> value的结果为inFile,而在需要一个bool值的情况下,inFile的结果为inFile.good(),即true或false。
因此,可以对代码进行精简,将两条输入语句用一条用作循环测试的输入语句代替:
while (inFile >> value)
...
以上是关于❥关于C++之写入/读取文本文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?