|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
不知大家有没有遇到过ifstream.close()的错误。我准备写一个统计BPA的dat文件内各卡片数量的程序,dat文件是以“(END)”结尾的文本文件。
9 W' b, B( k; A& A5 a0 F当(END)出现在dat文件最后一行时,程序正常,但若(END)后有一个空行,执行到fin.close()这一步会出现错误,太莫名其妙了。敬请各位高手指教。5 `! B: a# B2 t
: a0 ]2 L# N4 s. s R' t
void KBPAClass::CountList() //统计各类卡片的数量 ; M$ o3 e" b; l- J0 S# U' m
{
+ {' ?. R$ X d$ U2 a1 K if(m_strDatInFile=="") //检查DAT文件路径是否为空
/ u+ v. n" ] t. X# }3 v {4 K, s: o( |! _
cout<<"\n数据不完整,缺少DAT文件输入路径!";9 z$ `4 D! \( q, x
exit(0);
6 }& b: X+ \; Z; r% f7 Y* O }: b2 h& R/ o" U6 |; `
ifstream fin(m_strDatInFile.c_str());
, y2 Q5 p2 k, @9 x1 F" { if(!fin)8 s; Y- e3 c( _5 J- ~/ ^ o# C5 R
{ k6 f) q3 J# Z( @
cout<<"\n不能打开DAT输入文件,程序退出"<<endl;* P8 P+ Q) S* U6 F
exit(0);. U9 [3 F, n$ B8 _
}7 G* e: V; M' j( Y) G
char buffer[240]; //因为卡片有效位数为80(某些卡可能到90),但考虑到可能有空格,多设置一些1 G/ R" t1 B0 y( d" ]0 V/ D
while(int(fin.tellg())!=-1)
$ Y+ B* c. L( D! u* M- c+ T! l: I8 i {
. }5 K Z1 Q$ o9 R7 d for(int i=0;i<sizeof(buffer);i++)0 r/ o) j% m5 O' n# y4 a
{* m' `% Y1 J; ^- }) o8 ?
fin.get(buffer[i]);/ f7 u8 G8 g% A3 ]% ?- u
if(buffer[i]=='\n'||fin.eof())
/ U% x; S& @+ N0 V4 ^ {
$ J! O% a. T% A& G buffer[i]='\0';
* ~3 p) _# ?( s2 \1 z: Y* l$ i break;
0 D7 u* _! D! Y5 q }
8 u. l% n* I' N2 L/ o }" g. V# i6 }' s$ x5 Q! e. n% S
buffer[sizeof(buffer)-1]='\0';
& R; Q1 h8 ]7 ?( Q# h. c: ~0 g string s(buffer);
' e. {9 T0 s6 @. { W if(s.size()<2) continue;. o/ v% g( j. G* a
else if(s.substr(0,1)=="("||s.substr(0,1)=="/") //标志或控制语句
% D$ E8 }1 L) C, u i" e" ?: [ {- ~2 E, u3 y9 _3 V7 q; y9 \
m_nCtrlNum++;
% I' C) b$ R( d9 E! B: s* R, J if(s.substr(0,5)=="(END)") 0 y# d$ Q8 { w
break;
3 T* a3 X7 Z6 w& `; V& e+ I }, T% h z N. E# K
}: G/ i, _# i# E" V+ k8 N1 j
fin.close(); @" l0 x/ U+ y( e5 k
} |