使用 CFile 来读取特定格式的数据

1. 概述

使用 fstream 进行文件读写似乎显得与 MFC 格格不入,主要是因为 << 和 >> 运算符号的使用。我的认识也许是错误的。这里给出用 CFile 来读取特定格式的文件的方法。文件中包括任意的注释行、空行和字符串行,要实现的功能是要跳过注释和空行,把所有的字符串读入一个 CString 数组中。注释行以指定的字符开头,例如“#”。

空行特征:     /n/r
注释行特征:   /n#.../r
字符串行特征:  /n..../r

2. 可重用代码

以下内容摘自 HEE 源代码。 

2.1 建立数组

CString File;// 文件名
CString* Table=NULL;// 放置字符串的数组,初始化
CFile file(File,CFile::modeRead);// 创建 CFile 对象
int c=0;//读行计数器

char CurrentChar[1];//用来存放当前读入的字符
unsigned long Offset;//偏移量用来读文件的什么位置

//判断某一行是否空行、注释行,如果不是就加1。
for(Offset=0;Offset<=file.GetLength();Offset++)
{
 file.Seek(Offset,CFile::begin);
 file.Read(CurrentChar,1);

 if(Offset == 0)//第一行需作特殊处理,如果第一行的第一个字符不是#,不是/r,那么肯定是数据行。
 {
  if(CurrentChar[0]!='#' && CurrentChar[0]!='/r')
  {
   c ++;
  }
 }
//碰到/n时,表明遇到新的一行。除掉这个新行开始标记后,如果第一个字符不是#,不是/r,也同样肯定是数据行。

 else if(CurrentChar[0] == '/n')
 {
  Offset ++;
  if(Offset < file.GetLength())
  {
   file.Seek(Offset,CFile::begin);
   file.Read(CurrentChar,1);
   if(CurrentChar[0]!='#' && CurrentChar[0]!='/r')
   {
    c ++;
   }
  }
 }
}

Table = new CString[c];

2.2 把字符串读入数组

int i=0;
for(Offset=0;Offset<=file.GetLength();Offset++)
{
 file.Seek(Offset,CFile::begin);
 file.Read(CurrentChar,1);

 if(Offset == 0)//第一行需作特殊处理,如果第一行的第一个字符不是#,不是/r,那么肯定是数据行。
 {
  if(CurrentChar[0]!='#' && CurrentChar[0]!='/r')
  {
   while(CurrentChar[0]!='/r')//取出字符串
   {
    Table[i] += CurrentChar[0];
    Offset ++;
    file.Seek(Offset,CFile::begin);
    file.Read(CurrentChar,1);
   }
   i ++;
  }
 }
//碰到/n时,表明遇到新的一行。除掉这个新行开始标记后,如果第一个字符不是#,不是/r,也同样肯定是数据行。
 else if(CurrentChar[0] == '/n')
 {
  Offset ++;
  if(Offset < file.GetLength())
  {
   file.Seek(Offset,CFile::begin);
   file.Read(CurrentChar,1);
   if(CurrentChar[0]!='#' && CurrentChar[0]!='/r')
   {
    while(CurrentChar[0]!='/r' && Offset<file.GetLength())//取出字符串
    {
     Table[i] += CurrentChar[0];
     Offset ++;
     file.Seek(Offset,CFile::begin);
     file.Read(CurrentChar,1);
    }
    i ++;
   }
  }
 }
}

file.Close();

3. 说明

可使用 CString 的成员函数对读入的字符串进行操作,筛选、过滤有用的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值