C++简单文件输入输出
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,否则被转换为 false | ifstream 对象本身被用作测试条件时,如果最后一个读取操作成功,则被转换为布尔值true,否则被转换为false |
资料参考 C++ Primer Plus (第六版)中文版,仅学习使用