❥关于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++之文件结尾及处理

将文本写入文件后的mfc c++奇怪的块字符

如何在 C++ 上读取文件、反转部分文本并将反转的部分写入另一个文件?

c++ 当在一个线程中写入并在第二个线程中读取同一个对象时会发生啥? (它安全吗?)[重复]

关于c++文件流读入和写入的问题

使用 C++ 读取文本文件