要点提炼:
1、读取数字循环;
2、简单文件输入输出;
3、写入文件文本;
4、读取文本文件
cctype头文件中的字符函数库:一组方便功能强大的工具——可用于分析字符输入。
isalnum(ch):若参数为字母或数字,则函数返回true。
参考第6章 - 179页的表中
C++也支持goto语句,但最好不要用,应使用结构化控制语句来控制程序的流程。
1、读取数字循环:
int n;
cin >> n;
若输入不是数字,即类型不匹配则会发生:
1、n的值保存不变
2、不匹配的输入将被留在输入队列中;
3、cin对象中的一个错误标记被设置;
4、对cin方法的调用将返回false(如果被转换为bool类型);
输入错误和EOF都将导致cin返回false。
因此若输入错误内容时,应采取如下步骤顺序:
1、重置cin以接受新的输入;
2、删除错误的输入;
3、提示用户再输入。
错误处理关键部分代码:
while (!(cin >> golf[i])) {
cin.clear(); // reset input
while (cin.get() != '\n') { // \n 是回车符
continue; // get rid of bad input
}
cout << "Please enter a number: ";
}
2、简单文件输入输出:
C++将读取键盘输入和在屏幕上显示输出,统称为控制台输入输出。
cin输入一开始为文件。因此控制台输入的文件版本是文本文件,即每个字节都存储了一个字符编码的文件。并非所有的文件都是文本文件,例如数据块和电子表格以数值格式(即二进制整数或浮点格式)来存储数值数据。另外,字处理文件可能包含文本信息,但也可能包含用于描述格式、字体、打印机等的非文本数据。
3、写入文件文本:
头文件fstream;
声明ofstream对象变量;
将ofstream对象和文件关联,方法之一使用open()函数;
使用完文件后应close()使其关闭;
ofstream fout;
ofstream fout2;
fout.open("fish.txt"); // fout used to write to the fish.txt file
double wt = 123.34;
fout << wt; // write a nnumber to fish.txt
char line[8] = "Objects are closer than they appear.";
fout << line << endl; // write a line of text
char filename[50];
cin >> filename;
fout2.open(filename); // fout2 used to read specified file
完整例子:
// outfile.cpp -- writing to a file
#include<iostream>
#include<fstream> // for file I/O
int main(){
using namespace std;
char automobile[50];
int year;
double a_price;
double d_price;
ofstream fout;
fout.open("out_file.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;
// 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 fout instead of cout
fout << fixed;
fout.precision(2);
fout.setf(ios_base::showpoint);
fout << "Make and model: " << automobile << endl;
fout << "Year: " << year << endl;
fout << "Was asking $" << a_price <<endl;
fout << "Now asking $" << d_price <<endl;
fout.close(); // done with file
return 0;
}
若忘记调用close()关闭文件,程序正常终止时将自动关闭它。
fout可使用cout可使用的任何方法。
若写入的文件不存在则会创建它,若已存在,则默认情况下open()将首先截断该文件,即将其长度截短到零——丢弃原有的内容。然后将新内容写入。【后续介绍修改这种行为】
打开文件用于接受输入时可能失败。例如,指定文件可能已存在,但禁止对其进行访问。因此需要检查打开文件的操作是否成功。【is_open()】
4、读取文本文件:
头文件fstream;
声明ifstream对象变量;
将ifstream对象和文件关联,方法之一使用open()函数;
可以像使用cin一样使用它;
使用完文件后应close()使其关闭;
ifstream inFile;
ifstream fin;
inFile.open("bowling.txt"); // inFile used to read the bowling.txt file
double wt = 123.34;
inFile >> wt; // read a nnumber from fish.txt
char line[81];
fout.getline(line, 81); // read a line of text
char filename[50];
cin >> filename;
fin.open(filename); // fin used to read specified file
若试图打开不存在文件时,将导致后面使用ifstream对象进行输入时失败。检查文件是否被成功打开的首先方法是使用方法【is_open()】:
inFile.open("bowling.txt");
if (!inFile.is_open()){
exit(EXIT_FAILURE);
}
exit()函数原型在头文件cstdlib中定义的,也定义了用于操作系统通信的参数值【EXIT_FAILURE】,该函数终止程序。【旧版编译器可使用good()替代,但该方法可能存在一些问题】
完整例子:
// functions with an array argument
#include<iostream>
#include<cstdlib> // file IO support
#include<fstream> // support for exit()
const int SIZE = 60;
int main(){
using namespace std;
char filename[SIZE];
ifstream fin; // object for handing file input
cout << "Enter name of data file: ";
cin.getline(filename, SIZE);
fin.open(filename); // associate fin with a file
if (!fin.is_open()){
cout << "Could not open the file: " << filename << endl;
cout << "Program terminating.\n";
exit(EXIT_FAILURE);
}
double value;
double sum = 0.0;
int count = 0;
fin >> value; // get first value
while (fin.good()) { // while input good and not at EOF
++count; // one more item read
sum+=value; // calculate running total
fin >> value; // get next value
}
if (fin.eof()) { // or fin.fail() is better than this
cout << "End of file reached.\n";
} else if (fin.fail()) {
cout << "Input terminating 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;
}
fin.close(); // finished with the file
return 0;
}
可以将上面文件读取循环部分简化为:
// omit pre-loop input
while (fin >> value) { // read and test for success
// loop body goes here
// omit end-of-loop input
}
【fin >> value】表达式的返回结果为fin对象本身,而在需要一个bool值的情况下,fin对象的结果为fin.good()即true或false
读取文件时需要检查以下几点:
读取文件时不应超过EOF。如果最后一次读取数据时遇到EOF,方法eof()将返回true。
可能遇到类型不匹配的情况。则方法fail()将返回true(注意:若遇到了EOF,该方法也返回true)。
可能出现意外问题,如文件受损或硬件故障。如果最后一次读取文件时发送了这样的问题,方法bad()将返回true。
若不分开检查这些情况,一种更简单的方法是使用good()方法,该方法在没有发生任何错误时返回true。方法good()指出最后一次读取输入的操作是否成功。