⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 文本编辑程序 可以对文本进行修改 添加删除等操作
💻
字号:
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "io.h"
#include "docedit.h"
char *infile="in.txt";
char *outfile="out.txt";
int scr_next=0;
int des_next=0;

void main()
{
int r_val;
char cmd;
int lnum;
char str[256];
bool exit=0;
DOC_CONTEXT DocContext;

memset(&DocContext,0,sizeof(DocContext));
if(!LoadDocFromFile(&DocContext,infile))
	return;
SaveDocToFile(&DocContext,outfile);

while(!exit)
{
	printf("输入命令:");
	cmd=getchar();
	while(cmd==10)
		cmd=getchar();

	switch(cmd)
	{
	case 'i':		//插入
		printf("输入行号:");
		scanf("%d",&lnum);
		printf("输入文本:");
        scanf("%s",&str);
		str[MAX_COL]='\0';
		InsertLine(&DocContext,str,lnum);
		PrintfContext(&DocContext);
		break;
	case 'd':		//删除
		printf("输入要删除的行号");
		scanf("%d",&lnum);
		DeleteLine(&DocContext,lnum);
		PrintfContext(&DocContext);
		break;
	case 'n':		//切换
		memset(&DocContext,0,sizeof(DocContext));
		r_val = LoadDocFromFile(&DocContext,infile);
		r_val = SaveDocToFile(&DocContext,outfile);
		break;
	case 'p':		//显示
		PrintfContext(&DocContext);
		break;
	case 'q':
		exit=1;
		break;
	default:
		break;
	}
}
r_val = SaveDocToFile(&DocContext,outfile);
}



/*------------输出整篇文章内容-------------*/
/*
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] 指向文章结构的指针
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;
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;
unsigned long maxsize=MAX_COL * MAX_LINES*sizeof(char);
unsigned long size;

if (pContext == NULL || szFileName == NULL)
{
return 0;
}
/*open the existed file for reading*/
pFile = fopen(szFileName,"r");
if (pFile == NULL)
{
return 0;
}

//fseek(pFile,scr_next,0);

FileLen = filelength(fileno(pFile));

size=FileLen>maxsize?maxsize:FileLen;

/*做一个简单的文件长度检查*/

pcBuffer = (char *)malloc(size);

if (pcBuffer == NULL)
{
fclose(pFile);
return 0;
}

memset(pcBuffer,0,size); /*clear memory*/

size = fread(pcBuffer,1,size,pFile);

scr_next+=size;

/*remember to close the source file*/
fclose(pFile);
/*all file data is in buffer now*/

for (pos=0; pos < size; pos++)
{
/*将'\n'硬换行转变为字符串结束的NULL*/
if (pcBuffer[pos] == 0x0d || pcBuffer[pos] == 0x0a)
{
pcBuffer[pos] = '\0';
}
}
/*将缓冲区的字符串列表依次复制到DOC_CONTEXT*/
pContext->TotalLines = 0;
for (pos=0; pos < size;)
{
strcpy(pContext->Context[pContext->TotalLines],&pcBuffer[pos]);
pos += strlen(&pcBuffer[pos]) + 1;
pContext->TotalLines++;

}

/*remember to release buffer memory*/
free(pcBuffer);
return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -