废话不多数,先来简单展示下程序界面。
学完C后老师要求写个大点的项目,当时就随便选了这个,结果发现难度还是有点大的,别人写个小游戏就三四百行,我这个给整成快800行了_,不过最终还是写出来了,由于初次学习C语言,编程能力有限,代码写的可能不够漂亮,但还是决定拿出来分享下。供有需要的同学提供借鉴。
环境:
Windows10系统+Visual Studio 2017 Community
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//数据节点结构
typedef struct _node {
char *Data; //字符串
int da_lg; //字符串长度
struct _node *next; //下一个节点位置
struct _node *last; //上一个节点位置
}sjjd, *Sjjd; //数据节点结构
//查找数据保存
typedef struct _find_data{
int num; //出现编号
int jd_num; //节点编号
Sjjd sjjd_last; //上一个数据节点地址
Sjjd sjjd_next; //下一个数据节点地址
struct _find_data *fd_next; //下一个查找数据节点位置
}find_data, *Find_data;
void wenbenbj_1(char *fname); //文本编辑一级
void wenbencj_2(char *fname); //文本创建一级
void theme_3(void); //主题选择一级
void bi_ji(FILE *fp, char fname[100]); //编辑文本二级
void ch_ji(FILE *fp); //创建文本二级
char *cat_out_filename(char *fname); //截取文件名
int pdzfc(char fp); //判断字符类别函数
void sclb(Sjjd head,char fname[100]); //输出链表内容
Find_data str_fnd_xh(Sjjd head, char *str); //细化的查找功能模块
void dest_fd(Find_data head_fd); //释放查找结果链表函数
void str_fnd(Sjjd head); //字符串查找
Sjjd str_ins(Sjjd head, char *fname); //字符串插入
Sjjd str_del(Sjjd head, char *fname); //字符串删除
Sjjd str_rep(Sjjd head, char *fname); //字符串替换
void qut_n_save(Sjjd head, FILE *fp); //退出不保存
void qut_y_save(Sjjd head, FILE *fp, char *fname); //退出并保存
int main(void)
{
char fname[100], tmp; //文件名包含路径、缓冲区清理
int choice1; //菜单选择
char choice2; //继续操作选择
system("title Notepad_Simple 1.0"); //窗口标题显示程序名
do
{
printf("欢迎使用simple Notepad\n");
printf("注意事项:本程序“文件编辑功能”目前只支持英文文本操作\n(“创建文本”功能暂不受影响),后续版本会支持中文,由\n此带来的不便请见谅^_^!\n");
printf("请选择:\n");
printf("1:打开文件\t");
printf("2:创建文件\n");
printf("3:主题选择\t");
printf("4:退 出\n");
do
{
scanf("%d", &choice1);
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓冲区
if (choice1 < 1 || choice1 > 4)
printf("没有该选项,请重新输入:\n");
else
break;
} while (1);
switch (choice1)
{
case 1: system("mode con cols=90"); wenbenbj_1(fname); break;
case 2: system("mode con cols=60"); wenbencj_2(fname); break;
case 3: theme_3(); choice2 = 'y'; goto re; break; //执行完主题操作后直接跳转至开始界面
case 4: choice2 = 'n'; goto re; break;
}
printf("是否继续操作?y/n:");
scanf("%c", &choice2);
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓冲区
re: if (choice2 == 'y') //继续操作前清屏
system("cls");
} while (choice2 == 'y' );
return 0;
}
//函数定义区
//主函数功能模块-一级
void wenbenbj_1(char *fname) //文本编辑-一级
{
char tmp; //缓冲区清理
FILE *fp;
printf("请输入要打开的文件位置及名字(不超过100个字符)\n");
scanf("%s", fname);
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓冲区
while ((fp = fopen(fname, "r")) == NULL)
{
printf("打开文件失败!失败原因可能为;\n");
printf("1:文件名错误\n2:路径错误\n3:权限错误\n");
printf("请检查后重新输入文件位置及名字\n");
scanf("%s", fname);
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓冲区
}
system("cls"); //清屏
bi_ji(fp, fname); //调用编辑文本函数
}
void wenbencj_2(char *fname) //文本创建-一级
{
char tmp; //缓冲区清理
FILE *fp;
printf("请输入要创建的文件位置及名字(不超过100个字符)\n");
scanf("%s", fname);
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓冲区
while ((fp = fopen(fname, "w+")) == NULL)
{
printf("创建文件失败!失败原因可能为;\n");
printf("1:路径错误\n2:权限错误\n");
printf("请检查后重新输入文件位置及名字\n");
scanf("%s", fname);
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓冲区
}
system("cls");
printf("文件“%s”已成功创建!\n", fname);
ch_ji(fp); //调用创建文本函数
while ((tmp = getchar()) != '\n' && tmp != EOF); //清除输入缓