找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 472|回复: 3

[求助]:如何调用CFileException面向文件的异常类来判断CFile类是否到达文件尾?

[复制链接]
发表于 2003-1-26 00:21:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我编了如下代码但不知如何调用CFileException面向文件的异常类来判断CFile类是否到达文件尾,请各位赐教。
CFile Textfile;
Textfile.Open(SelectedText, CFile::modeRead);  
Textfile.SeekToBegin();       
Textfile.Read(strBuff, word);
CFileException Exception;
while (Exception.m_cause != 15)//判断CFile类是否到达文件尾
{
        Textfile.Seek(word, CFile::end);
        Textfile.Read(strBuff, word);
        acutPrintf("%s\n",strBuff);
}   
Textfile.Close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-1-26 23:43:32 | 显示全部楼层
你是想让 CFile 抛出异常到指定的 CFileException 对象吧.
就按你的思路吧,
应当先在CFile::Open()时指定, 否则,你的 (Exception.m_cause != 15) 会永远为真。
这样改:

  1.     CFile Textfile;
  2.     [color=blue]CFileException Exception;[/color]
  3.    
  4.     //Textfile.Open(SelectedText, CFile::modeRead);
  5.     [color=blue]Textfile.Open(SelectedText, CFile::modeRead, &Exception); // 指定Textfile的异常全都抛给Exception.[/color]
  6.    
  7.     Textfile.SeekToBegin(); // 这一句, 可要可不要
  8.    
  9.     //Textfile.Read(strBuff, word);
  10.     //CFileException Exception; //提到前面去
  11.    
  12.     while (Exception.m_cause != CFileException::endOfFile)//判断CFile类是否到达文件尾
  13.     {
  14.         // Textfile.Seek(word, CFile::end);  //word是个正数吧, 你这一句会立即产生endOfFile异常
  15.         Textfile.Read(strBuff, word);
  16.         acutPrintf("%s\n",strBuff);
  17.     }
  18.     Textfile.Close();
复制代码


其实,不用 CFileException 一样也可以判断CFile对象是否到达文件尾

  1.     CFile Textfile;
  2.     Textfile.Open(SelectedText, CFile::modeRead);
  3.     while(1)
  4.     {
  5.         int nRead = Textfile.Read(strBuff, word);
  6.         if (nRead > 0)
  7.           acutPrintf("%s\n",strBuff);
  8.         else
  9.           break;
  10.     }
  11.     Textfile.Close();
  12.    
复制代码


真要用CFileException, 应当用 try ... catch ... 来捕获异常。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-1-27 23:25:39 | 显示全部楼层
不知为何我调试时老是进入死循环?请问是什么原因?
CFile Textfile;
CFileException Exception;
Textfile.Open(SelectedText, CFile::modeRead, &Exception);       
int Number = 0;
while (Exception.m_cause != CFileException::endOfFile)
{
        Textfile.Seek(Number*Word, CFile::begin);
        Textfile.Read(strBuff, Word);         
        DataCArray.Add(strBuff);
        Number = Number++;
        acutPrintf("%d\n",Exception.m_cause);
}
当然我可以用其它方法可以实现判断是否到达TXT文件尾:
int Number = 0;
while (Textfile.GetPosition() <= (length-10))//扣除文本文件头5个字节和文本文件尾5个字节
{       
        Textfile.Seek(Number*(Word+2), CFile::begin);//加上回车换行符2个字节
        Textfile.Read(strBuff, Word);       
        acutPrintf("读出的第%d个数据:%s\n",Number,strBuff);
        Number = Number++;//文本文件中的数据行数为(Number+1)
}  
但我觉得用CFileException面向文件的异常类来判断可以具有通用性,还可以用来判断其他异常。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-1-29 00:32:57 | 显示全部楼层
最初由 于松荣 发布
[B]不知为何我调试时老是进入死循环?请问是什么原因?
CFile Textfile;
CFileException Exception;
Textfile.Open(SelectedText, CFile::modeRead, &Exception);       
int Number = 0;
while (Exception.m_cause != C... [/B]

Read同时也会置位文件指针, 无需用Seek。

如果你的文件长度不是 word 的整数倍,那么
  1. Textfile.Seek(Number*Word, CFile::begin);
复制代码
 
就会产生CFileException::badSeek 异常,在Seek已产生异常的情况下,你还要去Read,可能会产生CFileException::generic异常,永远得不到CFileException::endOfFile, 所以会陷入死循环。

文本文件,最好是用单字节处理,不要“块读”。
处理异常,最好是用 try ... catch...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-27 14:09 , Processed in 0.426808 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表