用c编写代码管理系统

断断续续用了三天时间写完的,写了三个小项目了,对c应该可以说是入门了吧!!

用c写的第三个小项目—代码管理系统!根据别人提供的功能描述动手完成的!
当然中间很多不会的难免会参考原版,亦在其基础上进行了相应的优化!
实现的功能见下链接:
原链接

用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;
    }
}

结果显示
用c编写代码管理系统