判断输入结束的简单方式
1. 从键盘输入
1.最简单的方式,while(cin>>a){…},当想结束时只需 换行+输入Ctrl+Z+回车,此时cin>>a的返回值为false。
例1.初始化字符数组
#include<iostream>
using namespace std;
int main(){
char ch[20];
int i=0;
char a;
while(cin>>a){
ch[i++]=a;
}
for(i=0;i<20;i++){
cout<<endl<<"ch["<<i<<"]: "<<ch[i];
}
return 0;
}
2.以某字符为结束标志,例如’#’。只需在上面while中加入判断a!=’#'即可。
例2.初始化字符数组,以#结束
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main(){
char ch[20];
int i=0;
char a;
while(cin>>a&&a!='#'){//以井号为结束符
ch[i++]=a;
}
for(int j=0;j<i;j++){
cout<<endl<<"ch["<<j<<"]: "<<ch[j];
}
return 0;
}
二. 从文件读入
1.利用fstream流的eof()判断是否到文件结尾
例3.1从文件读入字符初始化字符数组,用!eof()判断文件结尾(此时会多读一个)
#include<cstdio>
#include<cmath>
#include<iostream>
#include <fstream>
using namespace std;
int main(){
char ch[20];
int i=0;
char a;
ifstream myfile;
myfile.open("C:\\Users\\lianz\\Desktop\\test0310.txt");
while(!myfile.eof()){ //此时会多读一个!!这样写往往得不到正确结果
myfile>>ch[i++];
}
for(int j=0;j<i;j++){
cout<<"ch["<<j<<"]: "<<ch[j];
}
myfile.close();//关闭文件输入流
return 0;
}
我们发现,当文件已经到了末尾,他又会多读一个(若按行读取还可能会重复读取最后一行),这是因为在读完最后一个数据时,eofbit仍然是false。只有当流再往下读取时,发现文件已经到结尾了,才会将标志eofbit修改为true。
解决方案: 将!myfile.eof() 改为!myfile.peek()=EOF
修改后:
这次我们得到的就是正确的。
2.利用标志字符’#'作为读文件结束的标志
很简单,在while里加判断就行了。
while(myfile.peek()!=EOF){
myfile>>a;
if(a=='#')break; //读到#就结束
ch[i++]=a;
}
效果如图。
以上只是简单直接的实现方式,有更简单的方法欢迎交流。