C++ Primer Plus【复习笔记】-【分支语句和逻辑运算符】

要点提炼:
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()指出最后一次读取输入的操作是否成功。

上一篇:java/后端面试常见问题


下一篇:网络编程面试题