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 的成员函数对读入的字符串进行操作,筛选、过滤有用的信息。