第5章 循环和关系表达式
P152 循环和文本输入
使用原始的cin进行输入
直接上代码示例:
#include<iostream>
using namespace std;
int main() {
char ch;
int count = 0;
cout << "请输入字符以#结束:" << endl;
cin >> ch;
while (ch != '#') {
cout << ch;
++count;
cin >> ch;
}
cout << endl << count << "个字母读入\n";
return 0;
}
这段代码随便输入了几个运行结果如下:
程序在循环之前就读取了第一个字符,这样循环可以测试第一个字符。注意这很重要,因为第一个字符可能就是#,在这种情况下可以跳过整个循环。在使用cin时将会主动忽略在输入时的空格和换行符,在输入过程中发送给cin的输入被缓冲,这意味着只有在用户按下回车键后输入的内容才会被发送给程序。
使用cin.get(char)进行补救
使用cin.get()函数可以补救直接使用cin的部分不足:
#include<iostream>
using namespace std;
int main() {
char ch;
int count = 0;
cout << "请输入字符以#结束:" << endl;
cin.get(ch);
while (ch != '#') {
cout << ch;
++count;
cin.get(ch);
}
cout << endl << count << "个字母读入\n";
return 0;
}
运行结果如下:
从图中我们可以看出来cin.get()函数并没有忽略空格。
文件尾条件
检测文件尾EOF,Win环境下可以通过按Ctrl+Z和Enter来模拟文件尾条件(不同系统可能会不一样)。检测到EOF后,cin会将两位(eofbit和failbit)都设置为1,可以通过成员函数eof()来查看。若检测到EOF,则cin.eof()将返回bool值true。同样,若eofbit和failbit被设置为1,则fail()成员函数将返回true,反之false。由于eof()和fail()均报告读取后的结果,所以应将二者放在读取后。
#include<iostream>
using namespace std;
int main() {
char ch;
int count = 0;
cout << "请输入字符以#结束:" << endl;
cin.get(ch);
while (cin.fail()==false) {
cout << ch;
++count;
cin.get(ch);
}
cout << endl << count << "个字母读入\n";
return 0;
}
- 注意在使用EOF标记后,cin将不再读取输入,这对于文件来说是很合理的因为一个文件的尾之后一定不会再有内容了,但在输入的过程中可能会还有,这时可以在之后使用cin.clear()清除EOF标记,使输入继续进行。
- cin.get(char)的返回值是一个cin对象,但是在需要其发生转换的地方时会自动转换为bool类型(如在while循环中):
while(cin)
文件尾EOF其实相当于-1,如果使用cin.get()(没有参数)并测试EOF,则必须将返回值赋给int型变量,而不是char,之后再将其强制转换为char类型:
#include<iostream>
using namespace std;
int main() {
int ch;
int count = 0;
cout << "请输入字符以:" << endl;
while ((ch = cin.get())!=EOF) {
cout.put(char(ch));
++count;
}
cout << endl << count << "个字母读入\n";
return 0;
}
第6章 分支语句和逻辑运算符
P177 字符函数库cctype
在这个函数库中,有判断是否为字母、数字、标点符号的函数。如:若ch是一个字母,则isalpha(ch)函数将返回一个非零值,否则返回0.类似的还有很多。
P195 读取文本文件
- is_open()函数可以判断文件是否被打开,成功打开将返回true。
文件尾的判断
eof()只能判断是否达到EOF,而fail()可以用于检测EOF和类型不匹配,请看下面代码段:
if (inFile.eof())
cout << "文件已经结束";
else if (inFile.fail())
cout << "读取数据不正确";
else
cout << "未知错误";
这样就可以对不同的错误进行处理。P197页有关于good()的描述。
第7章 函数 C++的编程模块
使用交替乘除可防止中间操作数超过最大浮点数。
一则关于函数以数组为参的注意
请看如下代码:
#include<iostream>
using namespace std;
int test(int a[]) {
int c = sizeof(a);
return c;
}
int main() {
int a[3] = { 1,2,3 };
int b = test(a);
cout << sizeof(a)<<endl;
cout << b;
}
这段代码输出如下所示:
为什么不一样呢?因为在函数中传递的是数组的首元素地址,而在test函数中也是以指针的形式来操作数组的,要理解数组传递时的指针特性十分重要。
数组的区间处理
在理解了数组以指针传递的特性后,仍以上述示例为前提可以采用如下方式对数组进行分段处理:sum (a,a+3);
然后在sum函数内部利用指针的运算进行操作。
const的说明
const int * a = &b
指向的内容不可变,但指针指向可以变化
int *const a = &b
b内容可以边,但指针指向b这一内容不可变化
啊 这段比较重要 但也不想打了 直接页码P222