一、cin对非法输入的处理
int n; cin>>n;
上述语句中,如果用户输入一个字符,将发生错误,此时cin会进行以下几种处理:
1.不匹配的输入仍留在输入队列中
2.cin对象中的一个错误标记被设置
3.对cin方法的调用将返回false
因此输入错误时应使用以下步骤解决:
while(!(cin>>n)) //注意!(cin>>n)中的括号不能省略,输入错误时进入循环,直至输入正确
{
cin.clear(); //使用该方法清除错误标记
while(cin.get()!='\n'); //吸收输入队列中非法的输入,直至回车符出现
cout<<"请输入正确的值:";
}
二、cin对字符串的get()和getline()
C++中处理字符串有两种方式,一种是C风格的字符数组,一种是string类。
1.C风格的字符数组
C风格的字符数组表示字符串时必须以空字符结尾,即'\0'。
字符数组初始化:char a[10]="study" //隐式的包含结尾的空字符
通过cin输入时,将字符串读入到char数组中时,将自动加上结尾的空字符,因此长度为10的字符串需要长度为11的字符串数组才可以存储。
使用cin对char a[10]进行输入时,如果直接:cin>>a,则当键盘输入空格时,输入将判定为字符串输入结束,即读取不到空格后面的内容。可使用get()和getline()解决此问题。
面向行的输入:getline()
getline()函数将读取整行,以回车符作为输入结束的标志,并丢弃掉回车符。
使用方法:cin.getline(a,9) //注意长度为10的数组只能存储长度为9的字符串
面向行的输入:get()
get()与getline()类似,区别在于get()不丢弃回车符,将保留在输入队列中。
因此连续输入时,要在两个输入直接增加一个 cin.get(),用来吸收此回车符。
cin.getline(a,9); cin.get(); cin.get(b,9);
get相比于geiline()的好处在于:使用get()可以查看下一个字符是否为回车符来判断输入结束到底是因为已经读取了整行,还是因为数组已经填充满了。
2.string类
string类使用get()和getline()时,表示内容相同,但表示形式不同。
string str;
使用方法: getline(cin,str); get(cin,str);
三、文件的读取和写入
使用文件的读取和写入时必须包含头文件 #include <fstream>
1.文件读取
文件读取的步骤如下:
①创建一个ifstream对象
②将该ifstream对象与一个文件关联
③像使用cin那样使用该ofstream对象
④使用close()关闭流
int n;
ifstream inFile;
inFile.open("a.txt"); //双引号中的是文件名
inFile>>n;
inFile.close();
2.文件写入
文件写入的步骤如下:
①创建一个ofstream对象
②将该ofstream对象与一个文件关联
③像使用cout那样使用该ofstream对象
④使用close()关闭流
ofstream outFile;
outFile.open("a.txt"); //双引号中的是文件名,该方法会丢弃文件中原有内容
outFile<<"写入到a.txt中"<<endl;
outFile.close();