2.3 分支结构与简单的文件输入输出

1 if-else及ifelse-ifesle

if else语句通用结构:if(test-condition) statement1     else statement2。由于c++不会自动将if和else之间的所有代码视为一个代码块,因此必须使用大括号将这些语句组合一个语句块。

2 字符函数库cctype

c++从c语言继承一个与字符相关的、非常方便的函数软件包,它可以简化诸如确定字符是否为大写字符、数字、标点符号等工作,这些函数的原型是在头文件cctype中定义的。这些函数的返回类型为int,而不是bool,但通常bool转换让您能够视他们为bool类型。

常用的字符函数
isalpha(char)如果参数是字母,该函数返回true
isdigit(char)如果参数是数字(0-9),该函数返回true
isalnum(char)如果参数是字母函数,即字母或数字,该函数返回true
ispunct(char)如果参数是标点符号,该函数返回true
isspace(char)如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表符或者垂直制表符,该函数返回true

3 switch、break、continue语句

switch语句通用格式如下,integer-expression必须是一个结果为整数值的表达式,另外,每一个标签都必须是整数常量表达式。通常的标签是int或char常量,也可以是枚举量。switch语句与if else语句允许程序从选项中进行选择,如果选项实际取值范围、浮点测试或两个变量比较,应使用if else语句。如果所以选项都可以使用整数常量来标识,可以用switch语句或if else语句。由于switch语句中专门为这种情况设计,因此,如选项超过两个,就代码长度和执行速度而言,switch语句的效率更高。

switch(integer-expression)
{
    case label1: statements
    case label2: statements
    ...
    default    : statements
}

4 读取数字的循环

当要读取数字到变量中,用户输入了一个单词,此时发生类型不匹配的情况,cin调用将返回false(如果被转换为bool类型),a未获取到值,不匹配的输入仍在队列中,cin对象中的一个错误标记(failbit)被设置。cin方法返回fasle意味着可以用非数字输入来结束读取数字的循环,错误标记意味必须重置标记,程序才继续读取输入。

int a;
while(!(cin>>a)) 		    // 类型不匹配,cin调用会返回false 2)处
{
    cout<<"false"<<endl; 
    cin.clear();		    // 重置cin以接受新的输入 1)
    while(cin.get() !='\n' )        // 删除错误输入 
	continue;
    cout<<"enter a number again:";   // 提示用户再输入
}
cout<<a;

// 代码缺点:若输入为开头为数字的字符串,cin不断读取,直到遇到非数字字符,cin返回true,则不适合

1)处: clear()方法重置错误输入标记,同时也重置文件尾(EOF条件),输入错误和EOF都会导致cin返回false。

2)处:cin>>a实际上是一个cin方法函数调用,该函数返回cin。如果cin位于测试条件中,则将被转换为bool类型,输入成功,值为true,否则为false。

5 简单的文件输出

文件输出与cout用于控制台输出及其类似:必须包含头文件fstream,它定义了一个处理输出的ostream类,可以用来声明一个或多个对象;必须指明名称空间std,如为引用ofstream,必须使用编译指令using或前缀std::;需要将ofstream对象与方法关联起来,方法之一是使用open(),使用完后,使用close()将其关闭可结合使用ofstream对象和运算符<<来输出各种类型的数据

#include <iostream>
#include <fstream>
int main()
{
	using namespace std;
	ofstream outFile;                // 定义文件对象
	outFile.open("fish.txt");        // 将ofstream对象与方法关联起来 1)2)
	char name[10];
	int year;
	double price;
	cin.getline(name,10);
	cin >> year;
	cin >> price;

	outFile<<fixed;                        // 以小数表示法显示   3)
	outFile.precision(2);                  // 精确到小数点后两位
	outFile.setf(ios_base::showpoint);     // 显示小数点和额外的零,即使不需要
	outFile<<"name:"<<name<<endl;
	outFile<< "year:" << year <<endl;
	outFile << "price:" << price <<endl;	
        outFile.close();	
	return 0;
}

//      ofstream fout;                      // 1)
//	char filename[20];
//	cin>>filename;
//	fout.open(filename);

1)处: open() 接受一个c-风格字符串作为参数,可以是一个字面值,也可以是存储在数组中的字符串。

2)处: 程序运行前,fish.txt并不存在,open()将新建一个fish.txt文件,如果文件存在,open()方法首先截断该文件,即将其长度截短到零,丢弃原来内容,然后将新的内容加入到该文件中,也有可能因为禁止访问而输入失败

3)处:  outFile可使用cout使用的常用方法,它不但能够使用运算符<<,还可以使用各种格式化方法,如setf()和precision()。

6 简单的文件输入

文件输入包含如下步骤:包含头文件fstream;指明命名空间;将ifstream对象与文件关联起来,使用完后将其关闭;可结合使用ifstream对象和运算符>>来读取各种类型的数据;可使用ifstream对象与get()方法读取一个字符,与getline()方法读取一行字符;可结合使用ifstream和eof()、fail()等方法来判断输入是否成功。

#include <iostream>
#include <fstream>
#include <cstdlib>

const int size = 20;
char filename[size];
cin.getline(filename, size);   // 输入文件名
ifstream infile;                // 定义ifstream对象
infile.open(filename);          // 将对象与文件关联起来
if(!infile.is_open()){            // 测试文件是否打开  1)
    exit(EXIT_FAILURE);
}
	
double value;
double sum = 0;
int count = 0;
while(infile >> value){            // 循坏读取文件数据后测试  2)
    ++ count;
    sum += 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 << count << " " << sum << " " << sum/count <<endl; 
}
infile.close();

// 输出结果
data.txt
Input terminated by data mismatch.
3 45 15
// 文件data.txt数据
12 15.5 17.5 srt
18.4 19

1)处:如果文件成功打开,is_open()将返回true,可以用good()方法代替

2)处:ifstream对象本身作文测试条件时,如果最后一次读取操作成功,它将被转换为bool值true,否则为false。也可以采用如下代码

	infile >> value;
	while(infile.good()){        // 在执行读取输入操作后,立刻测试操作是否成功
		++ count;
		sum += value;
		infile >> value;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vinkuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值