终于找到了答案。。。
转载:http://blog.csdn.net/u012662688/article/details/51725491
读入数据类似字符串+数字+字符串+数字这样循环穿插混合的类型
比如下面的代码,main函数里有个while循环,无限刷菜单然后用户输入选项的那种,一开始使用freopen会导致缓冲区无限有数据,即无法继续输入选项了就
采用ifstream来解决,注释掉的是之前的会出问题的freopen版本的代码
#include<bits/stdc++.h>
#define N 50
#define M 50
#define W 50
#define Pi acos(-1.0)
#define clr(a) memset(a,0,sizeof a)
#define space(a) for(int i=0;i<a;i++)printf(" ");
using namespace std;
int m_num,w_num,s_num;//
struct m_item{
char name[N];
int no[N];
int score[N];
}m_item[M];
struct w_item{
char name[N];
int no[N];
int score[N];
}w_item[M];
int sc[5]={7,5,3,2,1};
int mod1(){
ifstream fin1("item.txt");
//freopen("item.txt","r",stdin);
while(fin1>>s_num>>m_num>>w_num){
cout<<s_num<<m_num<<w_num<<"\n";
// scanf("%d %d %d",&s_num,&m_num,&w_num);
// getchar();
for(int i=0;i<m_num;i++){
//gets(m_item[i].name);
fin1>>m_item[i].name;
//scanf("%s",m_item[i].name);
cout<<m_item[i].name<<"\n";
//printf("%s",m_item[i].name);
for(int j=0;j<s_num;j++){
fin1>>m_item[i].no[j];
//scanf("%d",&m_item[i].no[j]);
cout<<m_item[i].no[j]<<"\n";
//printf("%d",m_item[i].no[j]);
m_item[i].score[j]=sc[j];
}
}
}
for(int i=0;i<w_num;i++){
//gets(w_item[i].name);
fin1>>w_item[i].name;
//scanf("%s",w_item[i].name);
cout<<w_item[i].name<<"\n";
//printf("%s",w_item[i].name);
for(int j=0;j<s_num;j++){
fin1>>w_item[i].no[j];
//scanf("%d",&w_item[i].no[j]);
cout<<w_item[i].no[j]<<"\n";
//printf("%d",w_item[i].no[j]);
w_item[i].score[j]=sc[j];
}
//getchar();
}
fin1.close();
return 0;
}
int main(){
int option; // 系统功能菜单选项
int cnt1=0;
while(true){
// 输出系统功能提示菜单
cout<<option<<"\n";
cin>>option;
switch(option)
{
case 1:mod1();break;
// 添加相应代码
case 0:
exit(0);
default:
cout<<"输入选项不正确!请重新输入!"<<endl;
}
}
return 0;
}