文件操作:实现 建立:读,写,删除 功能

#i nclude "stdio.h"
#i nclude "stdlib.h"
struct line{
  char ``````text[81];
  int num;                /*行号*/
  struct line *next;      /*指向下一个输入项目的指针 */
  struct line *prior;     /*指向前一个项目的指针 */
};
struct line  *start;      /*指向表中第一个项目的指针 */
struct line  *last;       /*指向表中作后一个项目的指针 */
struct line  *find(int),*dls_store(struct line *);
void patchup(int,int),delete_text(),list(),save(char *),load(char *);
menu_select();
enter(int linenum);

void main(int argc,char *argv[])
{
  char s[80],choice,fname[80];
// struct line *info;
  int linenum=1;
  start=NULL;
  last=NULL;
  if(argc==2) load(argv[1]);/*装入命令行上的文件 */
  do{
         choice=menu_select();
         switch(choice){
                   case 1:printf("/t行号:");
                                  gets(s);
                                  linenum=atoi(s);
                                  enter(linenum);
                                  break;
                   case 2:delete_text();
                                  break;
                   case 3:list();
                                  break;
                   case 4:printf("/t文件名:");
                                  gets(fname);
                                  save(fname);
                                  break;
                   case 5:printf("/t文件名:");
                                  gets(fname);
                                  load(fname);
                                  break;
                   case 6:exit(0);
                }
           }while(1);
}

/* 显示菜单,供用户选择 */
menu_select()
{
  char s[80];
  int c;
  printf("/t/t1.输入/n");
  printf("/t/t2.删除一行/n");
  printf("/t/t3.显示一行/n");
  printf("/t/t4.文件存盘/n");
  printf("/t/t5.装入文件/n");
  printf("/t/t6.退出/n");
  do{
          printf("/n/n/t/t请按数字选择:");
          gets(s);
          c=atoi(s);
        }while(c<0||c>6);
  return(c);
}

/*将文本插在指定行端部  */
enter(int linenum)
{
  struct line *info;
  //char t[81];
  for(;;){
         /*  */
         info=(struct line *)malloc(sizeof(struct line));
         if(!info){
                 printf("/t! 内存不够!/n");
                 return(NULL);
  }
  printf("%d:",linenum);
  gets(info->text);
  info->num=linenum;
  if(*info->text){
        if(find(linenum)) patchup(linenum,1);
        if(*info->text) start=dls_store(info);
  }
  else break;
  linenum++;
  }
  return(linenum);
}

/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而  */
/*删除时,被删除的文本后面的行号必须减1 */
void patchup(int n,int incr)
{
  struct line *i;
  i=find(n);
  while(i){
        i->num=i->num+incr;
        i=i->next;
   }
}
/*按行号排序后插入 */
struct line *dls_store(struct line *i)
{
  struct line *old,*p;
  if(last==NULL){
           i->next=NULL;
           i->prior=NULL;
           last=i;
           return(i);
   }
  p=start;
  old=NULL;
  while(p){
           if(p->num){
                  old=p;
                  p=p->next;
           }
           else{
                  if(p->prior){
                         p->prior->next=i;
                         i->next=p;
                         p->prior=i;
                         return start;
                   }
                  i->next=p;
                  i->prior=NULL;
                  p->prior=i;
                  return(i);
           }
          }
   old->next=i;
   i->next=NULL;
   i->prior=old;
   last=i;
   return start;
}

/*删除一行 */
void delete_text()
{
  struct line *info;
  char s[80];
  int linenum;
  printf("/t行号:");
  gets(s);
  linenum=atoi(s);
  info=find(linenum);
  if(info){
        if(start==info){
                start=info->next;
                if(start) start->prior=NULL;
                else   last=NULL;
           }
        else{
           info->prior->next=info->next;
           if(info!=last)
                  info->next->prior=info->prior;
           else last=info->prior;
         }
        free(info);
        patchup(linenum+1,-1);
  }
}

/*查找一行文本  */
struct line *find(int linenum)
{
  struct line *info;
  info=start;
  while(info){
        if(linenum==info->num) return(info);
        info=info->next;
  }
  return(NULL);
}

/*显示文本  */
void list()
{
  struct line *info;
  info=start;
  while(info){
        printf("%d:%s/n",info->num,info->text);
        info=info->next;
  }
  printf("/n/n");
}

/*存文件 */
void save(char *fname)
{
  struct line *info;
  char *p;
  FILE *fp;
  if((fp=fopen("text.txt","w"))==NULL){
        printf("/t文件打不开!/n");
        exit(0);
  }
  printf("/t正在存入文件:/n");
  info=start;
  while(info){
                p=info->text;
                while(*p) putc(*p++,fp);
                //putc('/r',fp);
                putc('/n',fp);
                info=info->next;
   }
  fclose(fp);
}

/*装入文件 */
void load(char *fname)
{
  struct line *info,*temp;
  char *p;
  FILE *fp;
  //int t,size,inct;
  int size,inct;
  if((fp=fopen("text.txt","r"))==NULL){
        printf("/t文件打不开!/n");
        exit(0);
  }
  while(start){
                temp=start;
                start=start->next;
                free(temp);
   }
   printf("/n/t正装入文件 !/n");
   size=sizeof(struct line);
   start=(struct line*)malloc(size);
   if(!start){
                 printf("/n/t内存已经用完!");
                 return;
   }
   info=start;
   p=info->text;
   inct=1;
   while((*p=getc(fp))!=EOF){
           p++;
           while((*p=getc(fp))!='/n') p++;
           //getc(fp);      /*丢掉'/n'  */
           *p='/0';
           info->num=inct++;
           info->next=(struct line*)malloc(size);
           if(!info->next){
                 printf("/n/t内存已经用完!");
                 return;
           }
           info->prior=temp;
           temp=info;
           info=info->next;
           p=info->text;
        }
        temp->next=NULL;
        last=temp;
        free(info);
        start->prior=NULL;
        fclose(fp);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的基于C语言的文件系统的实现,具备基本的文件处理功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_FILENAME_LENGTH 100 #define MAX_FILE_SIZE 1000 typedef struct { char filename[MAX_FILENAME_LENGTH]; int size; char* content; } File; File* files[10]; int num_files = 0; void create_file(char* filename) { if (num_files == 10) { printf("Error: Maximum number of files reached.\n"); return; } for (int i = 0; i < num_files; i++) { if (strcmp(files[i]->filename, filename) == 0) { printf("Error: File with same name already exists.\n"); return; } } File* new_file = (File*) malloc(sizeof(File)); strcpy(new_file->filename, filename); new_file->size = 0; new_file->content = (char*) malloc(sizeof(char) * MAX_FILE_SIZE); files[num_files] = new_file; num_files++; printf("File created successfully.\n"); } File* find_file(char* filename) { for (int i = 0; i < num_files; i++) { if (strcmp(files[i]->filename, filename) == 0) { return files[i]; } } return NULL; } void open_file(char* filename) { File* file = find_file(filename); if (file == NULL) { printf("Error: File not found.\n"); return; } printf("File opened successfully.\n"); } void close_file(char* filename) { File* file = find_file(filename); if (file == NULL) { printf("Error: File not found.\n"); return; } printf("File closed successfully.\n"); } void delete_file(char* filename) { File* file = find_file(filename); if (file == NULL) { printf("Error: File not found.\n"); return; } for (int i = 0; i < num_files; i++) { if (files[i] == file) { for (int j = i; j < num_files-1; j++) { files[j] = files[j+1]; } num_files--; free(file->content); free(file); printf("File deleted successfully.\n"); return; } } } void copy_file(char* filename1, char* filename2) { File* file1 = find_file(filename1); if (file1 == NULL) { printf("Error: File 1 not found.\n"); return; } File* file2 = find_file(filename2); if (file2 != NULL) { printf("Error: File 2 already exists.\n"); return; } File* new_file = (File*) malloc(sizeof(File)); strcpy(new_file->filename, filename2); new_file->size = file1->size; new_file->content = (char*) malloc(sizeof(char) * new_file->size); memcpy(new_file->content, file1->content, new_file->size); files[num_files] = new_file; num_files++; printf("File copied successfully.\n"); } void read_file(char* filename) { File* file = find_file(filename); if (file == NULL) { printf("Error: File not found.\n"); return; } printf("File contents:\n%s\n", file->content); } void write_file(char* filename, char* content) { File* file = find_file(filename); if (file == NULL) { printf("Error: File not found.\n"); return; } if (strlen(content) > MAX_FILE_SIZE) { printf("Error: File size too large.\n"); return; } file->size = strlen(content); strcpy(file->content, content); printf("File written successfully.\n"); } void list_files() { printf("List of files:\n"); for (int i = 0; i < num_files; i++) { printf("%s\n", files[i]->filename); } } int main() { char command[20], filename1[MAX_FILENAME_LENGTH], filename2[MAX_FILENAME_LENGTH], content[MAX_FILE_SIZE]; while (1) { printf("> "); scanf("%s", command); if (strcmp(command, "create") == 0) { scanf("%s", filename1); create_file(filename1); } else if (strcmp(command, "open") == 0) { scanf("%s", filename1); open_file(filename1); } else if (strcmp(command, "close") == 0) { scanf("%s", filename1); close_file(filename1); } else if (strcmp(command, "delete") == 0) { scanf("%s", filename1); delete_file(filename1); } else if (strcmp(command, "copy") == 0) { scanf("%s", filename1); scanf("%s", filename2); copy_file(filename1, filename2); } else if (strcmp(command, "read") == 0) { scanf("%s", filename1); read_file(filename1); } else if (strcmp(command, "write") == 0) { scanf("%s", filename1); scanf("%s", content); write_file(filename1, content); } else if (strcmp(command, "list") == 0) { list_files(); } else if (strcmp(command, "exit") == 0) { break; } else { printf("Invalid command.\n"); } } return 0; } ``` 该文件系统使用一个File结构体来表示文件,其中包含文件名、大小和内容的指针。文件系统最多支持10个文件文件内容最大为1000个字符。文件系统支持创建、打开、关闭、删除、复制、和查询操作。用户可以通过命令行输入来执行这些操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值