这里只提一些之前我没怎么用过的一些特性:
将byte作为char的别名:
typedef typeName aliasName;
typedef char byte;
基于范围的for循环简化了常见的循环任务,对数组(或容器类,如vector和array)的每个元素执行相同的操作。(类似与python中的for i in range(x))
double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49};
for (double x : prices)
cout << x << std::endl;
其中,x最初表示数组prices的第一个元素。显示第一个元素后,不断执行循环,而x依次表示数组的其它元素。因此,上述代码显示全部5个元素,每个元素占据一行。总之,该循环显示数组中的每个值。
要修改数组的元素,需要使用不同的循环变量语法:
for (double &x : prices)
x = x * 0.80;
符号&表明x是一个引用变量,这猴子那个声明让接下来的代码能够修改数组的内容,而第一种语法不能。
还可以结合使用基于范围的for循环和初始化列表:
for (int x : {3, 5, 2, 8, 6})
cout << x << " ";
cout << '\n';
这种循环主要用于各种模板容器类。
cin对象支持3种不同模式的单字符输入,其用户接口各不相同。
#include
int main()
{
using namespace std;
char ch;
int count = 0;
cout << "Enter characters; enter # to quit:\n";
cin << ch;
while(ch != '#')
{
cout << ch;
++count;
cin >> ch;
}
cout << endl << count << "characters read\n";
return 0;
}
程序执行:
Enter characters; enter # to quit:
see ken run#really fast
seekenrun
9 characters read
程序中省略了空格,原因在于cin读取char值时,将忽略空格和换行符。因此输入中的空格没有被回显,也没有被包括在计数内。
而且发送给cin的输入被缓冲。也就是说只有在用户按下回车键后,他输入的内容才会被发送给程序。这就是在运行该程序时,可以在#后面输入字符的原因。按下回车键后,整个字符序列将被发送给程序,但程序在遇到#字符后将结束对输入的处理。
通常,逐个字符读取输入的程序需要检查每个字符,包括空格,制表符和换行符。cin.get(char)可以完成这个功能。
因此上面的程序可以用cin.get(ch)代替cin >> ch,这样就可以保留空格。这个函数和c语言的getchar函数可能有些不同,cin.get(ch)中的参数没有用&ch,这是由于C++中iostream将cin.get(ch)的参数声明为引用类型,因此该函数可以修改其参数的值。
其实cin.get(char)还有其它形式,cin.get(name, ArSize),这样做不对啊,一样的函数参数怎么能不一样呢,数目和类型都不一样。这是由于进行了函数重载,函数重载允许创建多个同名函数,条件是它们的参数列表不同。编译器会自动找到参数复合的函数去调用。
// cctype.cpp -- using the cctype.h library
#include
#include
int main()
{
using namespace std;
cout << "Enter text for analysis, and type @ to terminate input.\n"
char ch;
int whitespace = 0;
int digits = 0;
int chars = 0;
int punct = 0;
int others = 0;
cin.get(ch);
while (ch != '@')
{
if(isalpha(ch))
chars++;
else if(isspace(ch))
whitespace++;
else if(isdigit(ch))
digits++;
else if(ispunct(ch))
punct++;
else
others++;
cin.get(ch);
}
cout << chars << " letters, "
<< whitespace << " whitespace, "
<< digits << " digits, "
<< punct << "punctuations, "
<< others << "others.\n";
return 0;
}
使用cctype库要更加有效方便一些。下面是对其中的一些常用函数的总结:
函数名称 | 返回值 |
---|---|
isalnum() | 如果参数是字母或数字,该函数返回ture |
isalpha() | 如果参数是字母,该函数返回true |
iscntrl() | 如果参数是控制字符,该函数返回true |
isdigit() | 如果参数是数字(0~9),该函数返回true |
isgraph() | 如果参数是除空格之外的打印字符,该函数返回true |
islower() | 如果参数是小写字母,该函数返回ture |
isprint() | 如果参数是打印字符(包括空格),该函数返回true |
ispunct() | 如果参数是标点符号,该函数返回true |
isspace() | 如果参数是标准空白字符,如空格,进纸,换行符,回车,水平制表符或垂直制表符,该函数返回true |
isupper() | 如果参数是大写字母,该函数返回true |
isxdigit() | 如果参数是十六进制数字,即0~9,a~f,或A~F,该函数返回true |
tolower() | 如果参数是大写字符,则返回其小写,否则返回该参数 |
toupper() | 如果参数是小写字符,则返回其大写,否则返回该函数 |
首先包含头文件fstream
需要声明一个ofstream对象并命名:
ofstream outFile;
然后关联文件进行操作:
outFile.open("fish.txt");
double wt = 125.8;
outFile << wt << endl;
outFile.close();
ifstream inFile;
inFile.open("bowling.txt");
double wt;
inFile >> wt;
inFile.close();