不知大家有没有遇到过ifstream.close()的错误。我准备写一个统计BPA的dat文件内各卡片数量的程序,dat文件是以“(END)”结尾的文本文件。3 F# k$ F. j0 |" R
当(END)出现在dat文件最后一行时,程序正常,但若(END)后有一个空行,执行到fin.close()这一步会出现错误,太莫名其妙了。敬请各位高手指教。* H# @) ]8 c' ?- p, m
6 v( m) b5 @/ hvoid KBPAClass::CountList() //统计各类卡片的数量 * c7 q) H1 q3 M{ - S; y4 {$ S# u' C: l ]" X if(m_strDatInFile=="") //检查DAT文件路径是否为空' e: o& d3 C0 y. f3 J+ i) K$ B
{ 3 @ |0 {5 f. O cout<<"\n数据不完整,缺少DAT文件输入路径!";( }5 W8 ?! w' I( \* p7 _8 q
exit(0);/ `) _- F0 J' v4 Z
} x- P0 k+ H- l' C5 Z' ~0 | v ifstream fin(m_strDatInFile.c_str()); 5 t3 v2 r: z+ ^ d- O if(!fin) * `/ f# [- T4 Y( X { 1 W0 k4 F# b8 S" W$ ]9 Q" I cout<<"\n不能打开DAT输入文件,程序退出"<<endl;. t7 q P1 h+ |5 H: i2 W
exit(0); 8 B) Z+ e/ g4 f9 Z. v( P" g }" [/ h# T# [" b3 f, g6 v9 Y# t
char buffer[240]; //因为卡片有效位数为80(某些卡可能到90),但考虑到可能有空格,多设置一些2 ]" t5 V# q% R/ x% J! x
while(int(fin.tellg())!=-1)* g- z, i N. ^ t8 |: j
{ 4 n4 r# K: G4 y; q& D5 n) g6 ^. }- C for(int i=0;i<sizeof(buffer);i++); B6 }; r+ k6 v% R n
{7 X+ X" t. _. S; F8 T/ F, a3 p
fin.get(buffer[i]);% g: {. y8 X3 X/ Z V( B4 s% X: ~
if(buffer[i]=='\n'||fin.eof()) 5 y4 P, O; s v7 D' p2 k# y3 w/ k
{( s: \( H) U; Y' I2 {
buffer[i]='\0';$ m; E8 @; _2 }
break; , w! ]' H% y e6 t/ T } 1 v4 O& i! t/ h* o } 8 i* `' x' A& ^( N7 ~) R! E. F buffer[sizeof(buffer)-1]='\0'; " ]# j# C5 j$ T4 ~ string s(buffer); - t' Y& w3 _0 E" `$ D) U if(s.size()<2) continue; $ b2 w! b1 ]# d( V+ L/ K# n else if(s.substr(0,1)=="("||s.substr(0,1)=="/") //标志或控制语句- C! w3 y5 b( d6 ~2 Y0 T. {
{7 U2 X* W+ _& I6 c3 S. M
m_nCtrlNum++;; U: J% {: ~& f+ j9 |
if(s.substr(0,5)=="(END)") / l& j& o) x2 O: G break; 2 T. E3 ?0 O8 v% Y3 J }* u5 }+ A/ d5 p8 C, o
}8 [3 g+ P+ @2 O9 |( k
fin.close();5 s' @) [" h8 H5 |
}