继续MFC打字训练娱乐程序,今天先简要介绍一下程序中用到的一些函数,其实都可以写成类的形式,能更方便的使用,比函数形式有很大的好处,在小函数中我们只能定义了一下变量名后,在其他的函数中如果再用这个名称定义变量,就会出问题,但是如果用类的形式写出来就没有这种忧虑。本人目前对类的熟悉度还有待于提高,只能稍微了解下函数用法。平时我们接触的都是把所有的代码都放到一个CPP中,但是我们其实可以这样操作。
首先,右键头文件,添加新项,选中“.h”键入头文件名,然后在源文件中同样方法,但是要添加“.cpp”文件,尤其注意二者键入的文件名一样。
其次,我定义了头文件,里面代码如下:
#ifndef _DICTMGR_H
#define _DICTMGR_H
#define Max_______LineLength 30//代表每一行的长度,程序里和行的长度有关的都是常量
bool InitDict(char* file);
void CloseDict();
char* GetNext();
//void FileName(char *Dictionary);
#endif // _DICTMGR_H
需说明#ifndef _DICTMGR_H;#define _DICTMGR_H意思是,在应用该文件时先检查是否已经定义过,如若已经定义则#endif // _DICTMGR_H,这样可以防止重定义。
最后看看使用的函数功能:
#include "stdafx.h"
#include "DictMgr.h"
#include <stdlib.h>
#include <Windows.h>
static char * g_pFile = 0;//文本名
static int g_LineCount = 0;//用以存放文本中的行数
//获取一个文本中的行数
static int LineCount(FILE *fp)
{
char linebuf[Max_______LineLength] = {0};
int n = 0;
while (fgets(linebuf,Max_______LineLength, fp))
n++;
return n;
}
#define IS_ALPHA(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
#define IS_NUMBER(c) ((c >= '0' && c <= '9'))
//此操作用来省去每一行读入内存后的换行符
static void Trim(char* line)
{
//以下循环是把szWord最后的换行符清除
for (size_t i = 0; i < strlen(line); i++)
{
if (!(IS_ALPHA(line[i]) || IS_NUMBER(line[i])))
line[i] = 0;
}
}
bool InitDict(char* file)
{
FILE *fp = fopen(file,"r");
if (fp == 0)
{
return false;
}
char szLine[Max_______LineLength] = {0};
g_LineCount = LineCount(fp);//获知file中的行数
fseek(fp, 0, 0);
g_pFile = (char*)malloc(g_LineCount * Max_______LineLength);//申请动态内存
memset(g_pFile, 0, g_LineCount * Max_______LineLength);//对动态内存清零
//以下程序是把字典文件中的内容读到内存里;
char* pContent = g_pFile;
while(fgets(szLine,Max_______LineLength,fp))
{
Trim(szLine);
memcpy(pContent, szLine, Max_______LineLength);//把szLine代表的内存指向指针pContent中
pContent += Max_______LineLength;//将指针pContent移动到下一行以方便继续下一步对szLine的操作
memset(szLine, 0, Max_______LineLength);//将指针szLine清零
}
fclose(fp);
return true;
}
//文件使用完后要CLOSE
void CloseDict()
{
if (g_pFile)
{
free(g_pFile);
g_pFile = 0;
}
}
//获得文件中随机一个单词,饿哦使用的文件每个单词单独一行
char* GetNext()
{
srand(GetTickCount());
int index = rand() % g_LineCount;
return g_pFile + Max_______LineLength*index;
}
待续。。。。。。