📄 bb.h
字号:
文章编辑系统功能模块
/**********************************************************************
Document Editor Modules
programmed by bell kwong 2003.7.17
http://www.79cn.com
**********************************************************************/
/***************docedit.h*******************/
#ifndef DOCEDIT_H_
#define DOCEDIT_H_
#ifndef NULL
#define NULL ((void *)0)
#endif
#define MAX_COL 80 /*文档最大列数*/
#define MAX_LINES 100 /*文档最大行数*/
typedef struct _DOC_CONTEXT
{
unsigned char Context[MAX_COL+1][MAX_LINES];
int TotalLines; /*当前文档行数*/
}DOC_CONTEXT,*PDOC_CONTEXT;
int PrintfContext(PDOC_CONTEXT pContext);
int AddLine(PDOC_CONTEXT pContext,char *szNewStr);
int InsertLine(PDOC_CONTEXT pContext,char *szNewStr,int Pos);
int ModifyLine(PDOC_CONTEXT pContext,char *szNewStr,int Pos);
int DeleteLine(PDOC_CONTEXT pContext,int Pos);
int GetStringCount(PDOC_CONTEXT pContext,char *szDemo);
int GetLetterCount(PDOC_CONTEXT pContext);
int GetDigCount(PDOC_CONTEXT pContext);
int GetSpaceCount(PDOC_CONTEXT pContext);
int GetCharCount(PDOC_CONTEXT pContext);
int SaveDocToFile(PDOC_CONTEXT pContext,char *szFileName);
int LoadDocFromFile(PDOC_CONTEXT pContext,char *szFileName);
#endif /*DOCEDIT_H_*/
/***************docedit.c*******************/
#include stdio.h
#include string.h
#include stdlib.h
#include io.h
#include "docedit.h"
void main()
{
int r_val = 0;
DOC_CONTEXT DocContext;
memset(&DocContext,0,sizeof(DOC_CONTEXT)); //clear context buffer
AddLine(&DocContext,"www.79cn.com");
AddLine(&DocContext,"I AM A LITTLE COW!");
AddLine(&DocContext,"BELL");
AddLine(&DocContext,"123");
AddLine(&DocContext,"hello");
AddLine(&DocContext,"test test test");
InsertLine(&DocContext,"here is the inserted text",3);
ModifyLine(&DocContext,"here is the modified text",5);
PrintfContext(&DocContext);
//save to file and then reload from file
r_val = SaveDocToFile(&DocContext,"d:\\doc.txt");
memset(&DocContext,0,sizeof(DOC_CONTEXT)); //clear context buffer
r_val = LoadDocFromFile(&DocContext,"d:\\doc.txt");
DeleteLine(&DocContext,4);
printf("i have delete line 4,please check it again.\n");
PrintfContext(&DocContext);
printf("%d 'test' was found in context.\n",GetStringCount(&DocContext,"test"));
printf("totol letter count:%d\n",GetLetterCount(&DocContext));
printf("totol digital count:%d\n",GetDigCount(&DocContext));
printf("totol space count:%d\n",GetSpaceCount(&DocContext));
printf("totol char count:%d\n",GetCharCount(&DocContext));
}
/*------------输出整篇文章内容-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
return value
成功返回1,失败返回0
*/
int PrintfContext(PDOC_CONTEXT pContext)
{
int i = 0;
if (pContext == NULL)
{
return 0;
}
printf("\n::::::::::::::::::::::::::: Context start ::::::::::::::::::::::::::\n\n");
for (i=0; i < pContext->TotalLines; i++)
{
printf("line[%2d] %s\n",i,pContext->Context[i]);
}
printf("\n:::::::::::::::::::::::::::: Context end :::::::::::::::::::::::::::\n\n");
return 1;
}
/*------------在文章尾部追加一行-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
szNewStr
[in] 指向新字符串的指针
return value
成功返回1,失败返回0
*/
int AddLine(PDOC_CONTEXT pContext,char *szNewStr)
{
/*check parameters*/
if (pContext == NULL || szNewStr == NULL)
{
return 0;
}
if (pContext->TotalLines >= MAX_LINES)
{
return 0;
}
strcpy(pContext->Context[pContext->TotalLines],szNewStr);
pContext->TotalLines++;
return 1;
}
/*------------在文章指定行插入新行-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
szNewStr
[in] 指向新字符串的指针
Pos
[in] 插入的位置,如果为负则默认在尾部追加,这时同AddLine(),
注意该值从0开始,例如第一行则Pos为0,依次类推,下同.
return value
成功返回1,失败返回0
*/
int InsertLine(PDOC_CONTEXT pContext,char *szNewStr,int Pos)
{
int i = 0;
/*check parameters*/
if (pContext == NULL || szNewStr == NULL)
{
return 0;
}
if (pContext->TotalLines >= MAX_LINES)
{
return 0;
}
if (Pos > pContext->TotalLines)
{
return 0;
}
if (Pos < 0 || Pos == pContext->TotalLines)
{
strcpy(pContext->Context[pContext->TotalLines],szNewStr);
}
else
{
/*移动插入点后面的内容*/
for (i=pContext->TotalLines; i > Pos; i--)
{
memcpy(pContext->Context[i],pContext->Context[i-1],MAX_COL+1);
}
strcpy(pContext->Context[Pos],szNewStr);
}
pContext->TotalLines++;
return 1;
}
/*------------修改文章指定行-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
szNewStr
[in] 指向新字符串的指针
Pos
[in] 修改的位置
return value
成功返回1,失败返回0
*/
int ModifyLine(PDOC_CONTEXT pContext,char *szNewStr,int Pos)
{
/*check parameters*/
if (pContext == NULL || szNewStr == NULL)
{
return 0;
}
if (Pos < 0 || Pos >= (pContext->TotalLines-1))
{
return 0;
}
if (pContext->TotalLines >= MAX_LINES)
{
return 0;
}
strcpy(pContext->Context[Pos],szNewStr);
return 1;
}
/*------------删除文章指定行-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
Pos
[in] 删除的位置
return value
成功返回1,失败返回0
*/
int DeleteLine(PDOC_CONTEXT pContext,int Pos)
{
int i = 0;
/*check parameters*/
if (pContext == NULL)
{
return 0;
}
if (Pos < 0 || Pos >= (pContext->TotalLines-1))
{
return 0;
}
/*移动删除点后面的内容*/
for (i=Pos+1; i < pContext->TotalLines; i++)
{
memcpy(pContext->Context[i-1],pContext->Context[i],MAX_COL+1);
}
memset(pContext->Context[pContext->TotalLines-1],0,MAX_COL+1);
pContext->TotalLines--;
return 1;
}
/*------------统计某一字符串在文章中出现的次数-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
szDemo
[in] 指向待统计字符串的指针
return value
返回统计的次数,如果失败返回-1
remarks
区分大小写
*/
int GetStringCount(PDOC_CONTEXT pContext,char *szDemo)
{
int i = 0;
int count = 0;
int LineLen = 0;
int DemoLen = 0;
int ColPosition = 0; /*列位置*/
char *pStrStart = NULL;
/*check parameters*/
if (pContext == NULL || szDemo == NULL)
{
return -1;
}
DemoLen = strlen(szDemo);
for (i=0; i < pContext->TotalLines; i++)
{
/*计算当前行的字符串长度*/
LineLen = strlen(pContext->Context[i]);
for (ColPosition=0; ColPosition < LineLen;)
{
/*strstr() finds the first occurrence of a substring in another string*/
pStrStart = strstr(pContext->Context[i]+ColPosition,szDemo);
if (pStrStart != NULL)
{
ColPosition = pStrStart - pContext->Context[i] + DemoLen;
count++;
continue;
}
break;
}
}
return count;
}
/*------------统计文章的全部字母数-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
return value
返回统计的次数,如果失败返回-1
*/
int GetLetterCount(PDOC_CONTEXT pContext)
{
int i = 0;
int j = 0;
int count = 0;
int LineLen = 0;
/*check parameters*/
if (pContext == NULL)
{
return -1;
}
for (i=0; i < pContext->TotalLines; i++)
{
/*计算当前行的字符串长度*/
LineLen = strlen(pContext->Context[i]);
for (j=0; j < LineLen; j++)
{
if ((pContext->Context[i][j] >= 'a' && pContext->Context[i][j] <= 'z')
|| (pContext->Context[i][j] >= 'A' && pContext->Context[i][j] <= 'Z'))
{
count++;
}
}
}
return count;
}
/*------------统计文章的数字个数-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
return value
返回统计的次数,如果失败返回-1
*/
int GetDigCount(PDOC_CONTEXT pContext)
{
int i = 0;
int j = 0;
int count = 0;
int LineLen = 0;
/*check parameters*/
if (pContext == NULL)
{
return -1;
}
for (i=0; i < pContext->TotalLines; i++)
{
/*计算当前行的字符串长度*/
LineLen = strlen(pContext->Context[i]);
for (j=0; j < LineLen; j++)
{
if (pContext->Context[i][j] >= '0' && pContext->Context[i][j] <= '9')
{
count++;
}
}
}
return count;
}
/*------------统计文章的全部空格数-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
return value
返回统计的次数,如果失败返回-1
*/
int GetSpaceCount(PDOC_CONTEXT pContext)
{
int i = 0;
int j = 0;
int count = 0;
int LineLen = 0;
/*check parameters*/
if (pContext == NULL)
{
return -1;
}
for (i=0; i < pContext->TotalLines; i++)
{
/*计算当前行的字符串长度*/
LineLen = strlen(pContext->Context[i]);
for (j=0; j < LineLen; j++)
{
if (pContext->Context[i][j] == ' ')
{
count++;
}
}
}
return count;
}
/*------------统计文章的总字数-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
return value
返回统计的次数,如果失败返回-1
*/
int GetCharCount(PDOC_CONTEXT pContext)
{
int i = 0;
int count = 0;
/*check parameters*/
if (pContext == NULL)
{
return -1;
}
for (i=0; i < pContext->TotalLines; i++)
{
/*累加当前行的字符串长度*/
count += strlen(pContext->Context[i]);
}
return count;
}
/*------------保存文章到磁盘指定文件-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
szFileName
[in] 指向文件名字符串的指针
return value
成功返回1,失败返回0
*/
int SaveDocToFile(PDOC_CONTEXT pContext,char *szFileName)
{
int i = 0;
FILE *pFile = NULL;
unsigned int LineLen = 0;
unsigned char WriteBuffer[MAX_COL+2];
if (pContext == NULL || szFileName == NULL)
{
return 0;
}
/*create a file for writing*/
pFile = fopen(szFileName,"w");
if (pFile == NULL)
{
return 0;
}
for (i=0; i < pContext->TotalLines; i++)
{
LineLen = strlen(pContext->Context[i]);
strcpy(WriteBuffer,pContext->Context[i]);
/*添加'\n'来进行硬换行*/
WriteBuffer[LineLen] = '\n'; /*0x0d(0x0a)*/
if (fwrite(WriteBuffer,LineLen+1,1,pFile) < 1)
{
fclose(pFile);
return 0;
}
}
/*remember to close the target file*/
fclose(pFile);
return 1;
}
/*------------加载磁盘文章文件-------------*/
/*
parameters
pContext
[in] 指向文章结构的指针
szFileName
[in] 指向文件名字符串的指针
return value
成功返回1,失败返回0
*/
int LoadDocFromFile(PDOC_CONTEXT pContext,char *szFileName)
{
FILE *pFile = NULL;
char *pcBuffer = NULL;
unsigned long FileLen = 0L;
unsigned long pos = 0;
if (pContext == NULL || szFileName == NULL)
{
return 0;
}
/*open the existed file for reading*/
pFile = fopen(szFileName,"r");
if (pFile == NULL)
{
return 0;
}
FileLen = filelength(fileno(pFile));
/*做一个简单的文件长度检查*/
if (FileLen > (MAX_COL * MAX_LINES))
{
/*it must out of context buffer*/
fclose(pFile);
return 0;
}
pcBuffer = (char *)malloc(FileLen);
if (pcBuffer == NULL)
{
fclose(pFile);
return 0;
}
memset(pcBuffer,0,FileLen); /*clear memory*/
FileLen = fread(pcBuffer,1,FileLen,pFile);
/*remember to close the source file*/
fclose(pFile);
/*all file data is in buffer now*/
for (pos=0; pos < FileLen; pos++)
{
/*将'\n'硬换行转变为字符串结束的NULL*/
if (pcBuffer[pos] == 0x0d || pcBuffer[pos] == 0x0a)
{
pcBuffer[pos] = '\0';
}
}
/*将缓冲区的字符串列表依次复制到DOC_CONTEXT*/
pContext->TotalLines = 0;
for (pos=0; pos < FileLen;)
{
strcpy(pContext->Context[pContext->TotalLines],&pcBuffer[pos]);
pContext->TotalLines++;
pos += strlen(&pcBuffer[pos]) + 1;
}
/*remember to release buffer memory*/
free(pcBuffer);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -