cin和ifstream的.good().eof().fail()

eof()方法用于判断最后一次读取数据时候是否遇到EOF,若是返回true

fail()方法用于判断最后一次读取数据的时候是否遇到了类型不配的情况,若是返回true(如果遇到了EOF,该方法也返回true)

bad() 如果出现意外的问题,如文件受损或硬件故障,最后一次读取数据的时候发生了这样的问题,方法bad()将返回true。

good() 该方法在没有发生任何错误的时候返回true。该方法也指出的最后一次读取输入的操作是否成功。

ps:上述的"最后一次",不是上一次的执行情况,而是相当于一种预判断,如:

ifstream infile;

infile.open"*.txt";

infile>>value;

infile.good();这里判断的是第二次输入是否正常

infile>>value;

但是如果只写if(cin)或者if(infile),判断的是上一次的输入是否正常。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码中有几个问题: 1. `const char*Admin_tea at;` 这一行代码不符合语法规则,应该是声明一个 `Admin_tea` 对象,而不是一个字符指针。应该改为 `Admin_tea at;`。 2. `at.show();` 这一行的目的是调用 `Admin_tea` 类的 `show()` 方法,但是在此之前需要先创建一个 `Admin_tea` 对象。因此,可以将 `Admin_tea at;` 放在 `if(!f)` 的下面,或者在前面先定义一个 `Admin_tea` 对象,然后再在循环中使用。 3. `Vat.push_back(at);` 这一行代码将 `at` 对象添加到了 `Vat` 向量中,但是在此之前需要先创建一个 `Admin_tea` 对象,否则会出现未定义的行为。因此,应该将创建 `Admin_tea` 对象的代码移到循环内部,每次循环都创建一个新的对象。 4. `at.set(id,sname,by,bm,bd,xb,a,wy,wm,wd,t,p,w);` 这一行代码调用了 `Admin_tea` 类的 `set()` 方法,但是在此之前需要先创建一个 `Admin_tea` 对象。因此,应该将创建 `Admin_tea` 对象的代码移到循环内部,每次循环都创建一个新的对象。 5. `while(!f.eof())` 这一行代码使用了 `eof()` 函数来判断文件是否已经读取完毕,但是这种方法会导致最后一行数据被读取两次。应该改为使用 `while(f >> id >> sname >> by >> bm >> bd >> xb >> a >> wy >> wm >> wd >> tt >> pp >> w)` 这种方式来读取数据,并且将判断是否读取成功的条件改为 `while (!f.fail())`。 综上所述,下面是修改后的代码: ``` Admin_teaDatabase::Admin_teaDatabase(){ ifstream f; f.open("Admin_teaDatabase.txt"); if(!f) { cout<<"无法打开Admin_teaDatabase.txt\n"; exit(1); } int id; string sname; bool xb; float w; int by,bm,bd,wy,wm,wd,tt,pp; Title t; Position p; while(f >> id >> sname >> by >> bm >> bd >> xb >> a >> wy >> wm >> wd >> tt >> pp >> w) { Admin_tea at; cout<<id<<" "<<sname<<" "<<by<<" "<<bm<<" "<<bd<<" "<< xb <<" "<<a<<" "<<wy<<" "<<wm<<" "<<wd<<" "<<tt<<" "<<pp<<" "<<w<<endl; t=(Title)tt; p=(Position)pp; at.set(id,sname,by,bm,bd,xb,a,wy,wm,wd,t,p,w); Vat.push_back(at); } f.close(); } void Admin_teaDatabase::Add(){ cout<<"*********************Appending*******************\n"; cout<<"请输入选择:\n1: 教师.\t"<< "2: 行政人员.\t"<< "3: 教师兼行政人员.\t"<< "0:返回>>"; int choice; cin >> choice; switch(choice){ case 1: //教师 { Admin_tea at; at.Teacher::input(); Vat.push_back(at); break; } case 2: //行政人员 { Admin_tea at; at.Administrator::input(); Vat.push_back(at); break; } case 3: //教师兼行政人员 { Admin_tea at; at.input(); Vat.push_back(at); break; } case 0 : menu(); } //Save(f); //Display(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值