断断续续用了三天时间写完的,写了三个小项目了,对c应该可以说是入门了吧!!
用c写的第三个小项目—代码管理系统!根据别人提供的功能描述动手完成的!
当然中间很多不会的难免会参考原版,亦在其基础上进行了相应的优化!
实现的功能见下链接:
原链接
源代码见下:
头文件:
#ifndef __file_H
#define __file_H
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//文件夹结构体
typedef struct filebag
{
char name_filebag[100];
struct filebag* next;
}filebagdata;
extern filebagdata* a[100];//指向文件夹包结构体
extern int n;//文件夹个数
//文件夹操作
void filebag(void);//文件夹进行操作
void init_filebag(void);
int menu_filebag(void);//显示文件夹功能
void build_filebag(void);//创建文件夹
int search_bag(char[]);
void show_filebag(void);//显示文件夹
void delete_filebag(void);//删除文件夹
void quit_system(void); //推出该系统
//文件操作
int menu_file(void);
void build_file(void);//创建文件
void delete_file(void);//删除文件
void show_file(void);//显示文件
int search_fl(int ,char []);//查看文件是否存在,是返回0,不存在返回1
void operate_filedata(void);//对文件内容操作
//代码操作
int menu_filedata(void);//打印数据菜单栏
void read_filedata(void);//读取数据
void add_filedata(void);//增加一行代码
int line_code(char[]);//获取行数
void copy_code(char fname[],char copyd[]);//复制代码
void delete_filedata(void);//删除一行代码
void revise_filedata(void);//修改一行代码
void findnum_filedata(void);//按标号寻找一行代码
void finddetail_filedata(void);//按代码查找
#endif // __file_H
主程序
#include "file.h"
filebagdata* a[100] = {NULL};//指向文件夹包结构体
int n=0;//文件夹个数
int main()
{
filebag();
return 0;
}
void filebag(void)
{
int mode;
while(1)
{
mode = menu_filebag();
switch(mode)
{
case 1: build_filebag();break;
case 2: show_filebag();break;
case 3: delete_filebag();break;
case 4: operate_filebag();break;
case 0: quit_system();
default: printf("输入有误!请重新输入!!\n");break;
}
}
}
void operate_filebag()
{
int mode;
while(1)
{
mode = menu_file();
switch(mode)
{
case 1: build_file();break;
case 2: delete_file();break;
case 3: show_file();break;
case 4: operate_filedata();break;
case 0: return;
default: printf("输入有误!请重新输入!!\n");break;
}
}
}
operate_filedata()
{
int mode;
while(1)
{
mode = menu_filedata();
switch(mode)
{
case 1: read_filedata();break;
case 2: add_filedata();break;
case 3: delete_filedata();break;
case 4: revise_filedata();break;
case 5: finddetail_filedata();break;
case 6: findnum_filedata();break;
case 0: return;
default: printf("输入有误!请重新输入!!\n");break;
}
}
}
detaild.c
#include "file.h"
//文件夹操作
int menu_filebag(void)//打印菜单
{
int i;
printf(" \n选择式菜单\n");
printf("+====================================+\n");
printf("+ +\n");
printf("+ 1:建立文件夹 +\n");
printf("+ +\n");
printf("+ 2:查看文件夹 +\n");
printf("+ +\n");
printf("+ 3:删除文件夹 +\n");
printf("+ +\n");
printf("+ 4:对文件操作 +\n");
printf("+ +\n");
printf("+ 0:退出程序 +\n");
printf("+ +\n");
printf("+====================================+\n");
printf("\n请输入你要进行的操作:");
scanf("%d",&i);
getchar();//这里吸收回车,要不然到gets处,会直接跳过,因为get会直接接受缓存区的回车
return i;
}
void build_filebag(void)//创建文件夹
{
int i = -1;
filebagdata *head;
printf("文件夹名称:");
head = (filebagdata*)malloc(sizeof(filebagdata));
gets(head->name_filebag);
i = search_bag(head->name_filebag);
if(i == -1)//寻找是否存在同名文件
{
a[n] = head;
a[n]->next = NULL;
n++;
printf("%d\n",n);
return;
}
printf("该文件夹已存在!\n");
}
int search_bag(char namebag[])//判断文件夹是否存在,整数存在,-1不存在
{
for(int i=0; i<n; i++)
{
if((a[i] != NULL)&&(strcmp(a[i]->name_filebag, namebag) == 0))//这里是&&,是&程序崩溃.
//因为&&先计算左边表达式,若不满足则直接跳过,一般情况下&和&&结果一致,但是&两边表达式都会计算(位操作)
//所以使用&&相当于if(表达式1)if(表达式2)----所以这里面用&不可以,因为若表达式1不满足要求的话,表达式2中a[i]->name_filebag
//是非法的
{
return i;
}
}
return -1;
}
void show_filebag(void)//显示文件夹
{
int s = 0;
printf("文件夹如下所示:\n");
for (int i=0; i<=n; i++)
{
if(a[i] != NULL)
{
puts(a[i]->name_filebag);
s = 1;
}
}
if(s == 0) printf("还未创建文件夹!\n");
}
void delete_filebag(void)//删除文件夹
{
int i;
char delebag[30];
printf("删除文件夹名字:");
gets(delebag);
i = search_bag(delebag);
if(i != -1)
{
free(a[i]);
a[i] = NULL;
printf("删除成功!");
return;
}
printf("没有找到想删除的文件夹!\n");
}
void quit_system(void) //退出该系统
{
printf("拜拜!\n");
exit(0);
}
//文件操作
int menu_file(void)
{
int i;
printf("+====================================+\n");
printf("+ +\n");
printf("+ 1:创建文件 +\n");
printf("+ +\n");
printf("+ 2:删除文件 +\n");
printf("+ +\n");
printf("+ 3:显示某文件夹中的文件 +\n");
printf("+ +\n");
printf("+ 4:对文件内容操作 +\n");
printf("+ +\n");
printf("+ 0:返回上层操作 +\n");
printf("+ +\n");
printf("+====================================+\n");
printf("\n请输入你要进行的操作:");
scanf("%d",&i);
getchar();
return i;
}
//创建文件
void build_file(void)
{
int i;
char fbag[30],flname[30],ch;
printf("在哪个文件夹创建文件:");
gets(fbag);
if((i=search_bag(fbag)) == -1)
{
printf("文件不存在!\n");
return;
}
filebagdata *A1,*A2;
A1 = A2 = (filebagdata*)malloc(sizeof(filebagdata));
A1 = a[i];
printf("文件名字:");
gets(A2->name_filebag);
if (!(search_fl(i,A2->name_filebag)))
{
printf("含有同名文件!\n");
return;
}
else printf("添加文件成功\n");
while(A1->next != NULL)
{
A1 = A1->next;
}
A1->next = A2;
A2->next = NULL;
strcpy(flname, A2->name_filebag);//把数据放到链表末尾.
//puts(flname);
FILE *p;
if((p = fopen(flname,"w")) == NULL)
{
printf("文件打开失败!\n");
return;//exit(1);非正常退出更好
}
printf("请输入文件内容(以$结束)\n");
ch = getchar();//支持连续输入,只是存到缓存区,后续只读一个字符读取。
while(ch != '$')
{
fputc(ch,p);
ch = getchar();
}
fclose(p);
}
int search_fl(int i ,char flname[])//查看文件是否存在,存在返回0,不存在返回1
{
filebagdata *p1;
p1 = (filebagdata*)malloc(sizeof(filebagdata));
p1 = a[i];
while(p1->next != NULL)
{
if(!strcmp(p1->next->name_filebag,flname))
{
return 0;
}
p1 = p1->next;
}
return 1;
}
void show_file(void)//显示文件
{
int i;
char nfile[30];
printf("输入查看哪个文件夹的文件:");
gets(nfile);
i = search_bag(nfile);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
filebagdata *A1,*A2;
A1 = A2 = (filebagdata*)malloc(sizeof(filebagdata));
A1 = a[i];
if (A1->next == NULL)
{
printf("该文件夹还未创建文件!\n");
return;
}
while(A1->next != NULL)
{
puts(A1->next->name_filebag);
A1 = A1->next;
}
}
void delete_file(void)//删除文件
{
int i;
char fbname[30],fname[30];
printf("输入删除哪个文件夹的文件:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入删除哪个文件:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
filebagdata *A1,*A2;
A1 = A2 = (filebagdata*)malloc(sizeof(filebagdata));
A1 = a[i]->next;;
A2 = a[i];
while(strcmp(A1->name_filebag,fname))
{
A2 = A2->next;
A1 = A1->next;
}
if(A1->next == NULL)
{
A2->next = NULL;
}
else
{
A2->next = A1->next;
}
printf("删除成功!\n");
}
//数据操作
int menu_filedata(void)//打印数据菜单栏
{
printf("\n===============================================================\n");
printf(" 1-读取代码信息 2-增加一行代码 3-删除一行代码 4-修改一行代码\n");
printf(" 5-按代码查找 6-按标号查 0-返回上层操作\n");
printf("===============================================================\n");
printf("输入想要进行的操作:");
int mode;
scanf("%d",&mode);
getchar();
return mode;
}
void read_filedata(void)//读取数据
{
int i;
char fbname[30],fname[30];
printf("输入查看哪个文件夹:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入查看哪个文件的代码:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
filebagdata *A1,*A2;
A1 = (filebagdata*)malloc(sizeof(filebagdata));
A1 = a[i]->next;
while(strcmp(A1->name_filebag, fname))
{
A1 = A1->next;
}
FILE *p;
int ch;
if((p = fopen(fname,"r")) == NULL)//基础知识,==优先级高于=,所以要加上括号!
{
printf("打开文件失败!\n");
return;
}
while ((ch = fgetc(p)) != EOF)
printf("%c", ch);
fclose(p);
}
void add_filedata(void)//增加一行数据
{
int i,n;
char fbname[30],fname[30];
printf("输入哪个文件夹:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入增加哪个文件的代码:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
int m = line_code(fname); //获取代码行数
printf("在第几行增加代码:");
scanf("%d",&n);
getchar();
if((n==0)|(n > m+1))
{
printf("行数输入错误!\n");
return;
}
copy_code(fname,"copyd");//先复制代码
char adcode[100];
printf("输入增加的代码内容:");
gets(adcode);
FILE *p1,*p2;
int t = 0;
char str[100];
p1 = fopen( fname,"w");
p2 = fopen("copyd","r");
while(t < n-1)
{
fgets(str,100,p2);//遇到换行符,则结束
puts(str);
fputs(str,p1);
t++;
}
fputs(adcode,p1);//写入想要增加的内容
fputs("\n", p1);
while(fgets(str,100,p2))
{
fputs(str,p1);
}
remove("copyd");
fclose(p1);
fclose(p2);
}
int line_code(char fname[])//获取行数
{
FILE *p;
int n=0;
char str[100];
if((p = fopen(fname,"r")) == NULL)
{
printf("打开文件失败!\n");
return;
}
while (fgets(str, 1000, p)) // fgets循环读取,直到文件最后,才会返回NULL
n++; // 累计行数
fclose(p);
//printf("一共有%d行代码\n",n);
return n;
}
void copy_code(char fname[],char copyd[])//复制代码
{
FILE *fp1=fopen(fname, "r");
FILE *fp2=fopen(copyd, "w");
char ch;
while( (ch=fgetc(fp1) )!= EOF )
fputc(ch,fp2);
fclose(fp1);
fclose(fp2);
}
void delete_filedata(void)//删除一行代码
{
int i,n;
char fbname[30],fname[30];
printf("输入操作哪个文件夹:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入删除哪个文件的代码:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
printf("想要删除哪一行代码:");
scanf("%d",&n);
int m = line_code(fname); //获取代码行数
if ((n > m)|(n <= 0))
{
printf("该行不存在!\n");
return;
}
copy_code(fname,"copyd");
FILE *p1,*p2;
p1 = fopen( fname,"w");
p2 = fopen("copyd","r");
char str[100];
int t ;
for(t=1; t <= m; t++)
{
fgets(str,100,p2);
if(t != n)
fputs(str,p1);
}
remove("copyd");
printf("删除成功!\n");
fclose(p1);
fclose(p2);
}
void revise_filedata(void)//修改某一行代码
{
int i,n;
char fbname[30],fname[30];
printf("输入操作哪个文件夹:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入修改哪个文件的代码:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
printf("想要修改哪一行代码:");
scanf("%d",&n);
getchar();
int m = line_code(fname); //获取代码行数
if ((n > m)|(n <= 0))
{
printf("该行不存在!\n");
return;
}
char recode[30];
printf("想要该行代码修改为:");
gets(recode);
copy_code(fname,"copyd");
FILE *p1,*p2;
p1 = fopen( fname,"w");
p2 = fopen("copyd","r");
char str[100];
int t ;
for(t=1; t <= m; t++)
{
fgets(str,100,p2);
if(t != n)
fputs(str,p1);
else
{
fputs(recode,p1);
fputs("\n",p1);//没有把换行符记录其中,所以需要加上'\n'
}
}
remove("copyd");
printf("修改成功!\n");
fclose(p1);
fclose(p2);
}
findnum_filedata()//按标号寻找代码
{
int i,n;
char fbname[30],fname[30];
printf("输入操作哪个文件夹:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入查找哪个文件的代码:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
printf("代码所在标号:");
scanf("%d",&n);
getchar();
int m = line_code(fname); //获取代码行数
if ((n > m)|(n <= 0))
{
printf("该行不存在!\n");
return;
}
FILE *p1;
p1 = fopen(fname,"r");
char str[100];
for(int t=1; t <= m; t++)
{
fgets(str,100,p1);
if(t == n)
{
printf("第%d行:",t);
puts(str);
}
}
fclose(p1);
}
void finddetail_filedata(void)
{
int i,n;
char fbname[30],fname[30];
printf("输入操作哪个文件夹:");
gets(fbname);
i = search_bag(fbname);
if(i == -1)
{
printf("该文件夹不存在!\n");
return;
}
printf("输入查找哪个文件的代码:");
gets(fname);
if(search_fl(i ,fname) == 1)
{
printf("文件不存在!\n");
return;
}
int m = line_code(fname); //获取代码行数
char strcode[30];
printf("需要寻找具体的代码是:");
gets(strcode);
FILE *p1;
p1 = fopen(fname,"r");
char str[30];
int s = 0;
for(int t=1; t <= m; t++)
{
fgets(str,30,p1);
if (str[strlen(str)-1] == '\n')//找到line中的最后一个字符
str[strlen(str)-1] = '\0'; //如果是回车符,就把它改为‘\0‘
if(!strcmp(strcode,str))
{
printf("第%d行:",t);
puts(str);
s = 1;
}
}
fclose(p1);
if (s != 1)
{
printf("没找到该代码!");
return;
}
}
结果显示