|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
不知大家有没有遇到过ifstream.close()的错误。我准备写一个统计BPA的dat文件内各卡片数量的程序,dat文件是以“(END)”结尾的文本文件。 u& l9 S! j3 M3 w
当(END)出现在dat文件最后一行时,程序正常,但若(END)后有一个空行,执行到fin.close()这一步会出现错误,太莫名其妙了。敬请各位高手指教。
9 M# L9 G/ a4 N8 G/ O+ R! A) b* `5 b. M3 D& A7 z
void KBPAClass::CountList() //统计各类卡片的数量
8 Z! K H$ K6 [{ 9 z. u- w$ U) u* e [+ r2 b* w
if(m_strDatInFile=="") //检查DAT文件路径是否为空+ g5 |2 h% ^+ R3 c6 j& Y4 t) |
{: n0 u* j! L3 U! X$ \2 Q/ f
cout<<"\n数据不完整,缺少DAT文件输入路径!";
! v' Q9 Q) Q9 ~ exit(0);
6 W3 s, S1 a. ]7 h4 c' x }9 {7 _6 {, E/ ~0 a3 N; X
ifstream fin(m_strDatInFile.c_str());" w5 T+ W5 t+ Y7 `0 D
if(!fin)
' [: B K! `5 J% [. ]$ Y { 3 W7 j: X2 ?8 V, p; e! w1 G
cout<<"\n不能打开DAT输入文件,程序退出"<<endl;8 C/ r- N; T2 a% l8 ]2 O
exit(0);
7 D" |- ~$ S4 R( e; s }& w( m6 M J4 P3 s6 r5 u
char buffer[240]; //因为卡片有效位数为80(某些卡可能到90),但考虑到可能有空格,多设置一些3 T% L0 q3 L5 H( M/ `4 F: Z
while(int(fin.tellg())!=-1)1 y/ l6 @2 J o1 G& I' U
{
/ U$ g3 c* M" } for(int i=0;i<sizeof(buffer);i++)
; }) D' {+ i/ \, w" S% n9 z2 h. Z {. k$ ?# c0 M/ p* h% P
fin.get(buffer[i]);) r7 E8 L" Z* u+ b: e, R) A: G
if(buffer[i]=='\n'||fin.eof()) 7 s4 Z* k& Q0 O9 t
{
$ f/ u8 \# u; o* V buffer[i]='\0';* |1 Y7 {7 u& Q s. u- d2 g
break;
, f* m# u8 F" { }
; A x6 l3 V" d }8 L1 I$ ~" L2 i( K& T
buffer[sizeof(buffer)-1]='\0';
/ Q# j* o0 E/ E( W: X/ S string s(buffer);9 _, t, g8 Q' X1 z+ U" ~' y- k
if(s.size()<2) continue;+ _- W; x/ I. A' Y: ^
else if(s.substr(0,1)=="("||s.substr(0,1)=="/") //标志或控制语句/ y+ F7 n4 L! @4 N _. A
{" ~/ q" R; x5 a. R" c
m_nCtrlNum++;# }# m+ W" z1 n& z* g: \3 K& L
if(s.substr(0,5)=="(END)") % A/ L) G0 L1 |
break;
& w5 ^- S. [& P% h+ y }; o+ o& a/ w8 Y, s& d# @! Z( r
}) A: H1 n9 ~7 K) B# L2 R" }
fin.close();
& e9 q4 [( {! V8 P} |