C++ Primer Plus学习笔记(四)(输入输出错误处理、文件输入输出)

1. 字符函数库 cctype

cctype是字符函数库,用于判断是否为大写字母、标点符号、空格等

#include<cctype>
char ch;
isalpha(ch)//如果ch是字母,返回非零值,否则返回0
ispunct(ch)//如果ch是标点符号,返回非零值
isdigit(ch)//判断是否为数字
isa1num(ch)//数字或者字母
ch = tolower(ch)//转换为小写,如果为int值,先转换为char再进行相应转换。如 int ch;ch=tolower(ch),输入67,输出ch为99
ch = toupper(ch)//转换为小写

2. 错误输入

2.1 基本介绍

采用cin方式进行输入时,会发生类型不匹配的错误输入,会报错。

int n;
cin >> n;

例如,cin获取int值,如果输入字母值,会发生如下错误:
(1)n的值不变
(2)不匹配的输入会存在输入队列中‘
(3)cin对象的一个错误标记会被设置//必须重置该标记才可以继续输入
(4)cin调用的方法会返回false
注:错误输入和文件尾都会导致cin返回false,需要用cin.clear()进行清除。

    int num[10] = { 0 };
    int value;
    for (int i = 0; i < 10; )
    {
        if (cin >> value)
        {

            num[i] = value;
            i++;
        }
        else
        {
            cin.clear();//清除标记
            cin.get();//读取输出错误类型的值,因其还在缓冲队列中
            cout << "input the right num" << endl;
            continue;
        }
}

2.2 区别文件尾和类型不匹配

如上所述,文件尾和类型不匹配都会导致cin返回false(文件对象方法返回false)
以文件读取为例,当读取数据是遇到了文件尾,方法eof()、方法fail()会返回true,当发生类型不匹配时,方法fail()返回true;发生上述两种情况时,方法bad()会返回true,换个角度思考,正常读取时,方法good()返回true(不发生任何错误)

while (!inFile.good())
{
    ...
}

判断正常输入的标准做法

inFile >> value;
while(inFile.good())
{
    inFile >> value;
}
//由于inFile >>value 返回inFile对象,而在需要bool类型时,
此时返回值inFile可以为inFile.good(),
因此上面代码可以化简为:

while(inFile >> value)
{
    ...
}

3. 文件输入输出

文件输入、输出需要建立文件对象,并将其与特定文件联系起来,此后,类似于cin、cout的方法,文件对象可以采用与之相同的方法进行相应的处理。

3.1 写入文件

(1)包含头文件fstream
(2)头文件定义了一个用于处理输出的类ofstream,用这个类声明对象
(3)文件对象用方法.open()与特定文件联系起来,并用 <<来输出数据(写入文件)
(4)使用方法close()进行关闭

ofstream outFile;
ofstream fout;

outFile.open("1.txt");

char filename[50];
cin>>filename;
fout.open("2.txt");

outFile.close();
fout.close();

3.2 读取文件

(1)包含头文件fstream
(2)头文件定义了一个用于处理输出的类ifstream,用这个类声明对象
(3)文件对象用方法.open()与特定文件联系起来,并用 >>来读取数据(读取文件)
(4)使用方法close()进行关闭

ifstream inFile;
ifstream fin;


inFile.open("1.txt")
char line[30];
inFile.getline(line,31);

3.2 文件打开、错误检测

(1)文件打开
在打开文件后,务必进行检测是否成功打开,利用is_open()方法

inFile.open("1.txt");
if(!infile.is_open())//打开失败
{
    exit(EXIT_FAILURE);
}

(2)错误检测
见上面2.2

猜你喜欢

转载自blog.csdn.net/yanrong1095/article/details/80524807