美文网首页C语言学习笔记
C语言学习之--实现文件的读写

C语言学习之--实现文件的读写

作者: lemonCode | 来源:发表于2017-02-08 23:00 被阅读907次

第三部分文件操作部分

一. c语言文件指针

  1. 定义
    1. 指向一个文件的指针变量

      FILE *指针变量名;
      FILE *fp = NULL;
      注意:FILE是一个结构体
      
  2. 文件的打开和关闭
    1. 文件的打开

            建立文件的关联关系,用文件指针指向某个具体的文件,文件打开需要使用 fopen
               fopen("文件名","打开方式"); 
           注意:fopen有返回值,
               如果打开文件成功,返回文件的首地址
               如果打开文件失败,返回的是NULL
      
           完整的打开文件的语句:
      
              FILE *fp = NULL;
              fp = fopen("a.txt","r");  //r 只读
      
              简化:
              FILE *fp = fopen("a.txt","r");
      
    2. 文件的关闭

           fclose(文件的指针);
           fclose(fp);
      
  3. 字符读写函数:fgetc和fputc
    1. fputc 函数的作用 向指定文件中写入一个字符 ,fputc(字符常量或者是字符变量,文件指针);fputc函数有返回值,返回的时写入的字符
    2. fgetc 函数的作用 从指定的文件中读取一个字符,fgetc每次从文件中读取一个字符
  4. 数据块读写函数fread和write
    1. fwrite 和 fread 是数据的写入和读取的函数,每次读写一块数据,不是读取字符个数 fwrite(buffer,size,count,fp);fread(buffer,size,count,fp);

          //定义文件指针
           FILE *fp = fopen("fwriteString.txt","w");
       
           //判断文件是否打开成功
           if(fp!=NULL){
       
               // fwrite(buffer,size,count,fp);
               char str[]="helloWorld!";
               //使用fwrite 写入一块数据
               fwrite(str,strlen(str),1,fp);
               printf("文件写入成功!\n");
           }
      
    2. 从文件中读取结构体信息 fwrite(&stu[i],sizeof(struct Studnet),1,fp)

                #include<stdio.h>
                int main()
                {
                    struct student{
                        char name[20];
                        char sex;
                        int age;
                        float score;
                    };
                    
                    
                    struct student stu[5]={{"zbz",'F',38,59.99f},{"sb",'F',48,59.99f},{"cgx",'F',18,59.99f},{"dlj",'M',8,59.99f},{"banzhang",'Y',18,99.99f}};
                    //写入数据
                    
                    FILE *fp = fopen("student.data","wb+");
                    
                    if(fp!= NULL){
                        
                        for(int i = 0 ; i < 5 ; i++){
                            fwrite(&stu[i],sizeof(struct student ),1,fp);
                        }
                        
                         printf("文件写入成功!\n\n\n");
                         
                           //      文件指针拉回来
                        rewind(fp);
                        struct student stuArray[5];
                         printf("姓名\t\t性别\t\t年龄\t\t成绩\n");
                         for(int i = 0 ; i < 5 ; i++){
                            fread(&stuArray[i],sizeof(struct student),1,fp);
                            printf("%s\t\t%c\t\t%d\t\t%.2f\n",stuArray[i].name,stuArray[i].sex,stuArray[i].age,stuArray[i].score);  
                         }
                    }
                    
                    return 0;
                } 


    
3. 格式化读写函数fscanf和fprintf
    1.  fscanf()   格式化的读取,从文件中读取
    2.  fprintf() 格式化的写入,写入到文件中

             fscanf(fp,"%d:%f,%s\n%s",&productId,&productPrice,productTitle,productTitleImg);
             fprintf(fp,"%d:%.2f,%s\n%s",productId,productPrice,productTitle,productTitleImg);

二实现通讯录操作--代码实现

                    #include<stdio.h>
                    #include<string.h>
                    
                    //定义宏,联系人数组的长度,姓名长度,电话号码的长度 
                    #define NAME_LEN 22
                    #define TELNUM_LEN 16
                    #define LEN 100
                    
                    typedef struct{
                        char name[NAME_LEN];
                        char telNum[TELNUM_LEN];
                    } Person; //给结构体起一个别名
                    
                    //定义联系人数组,保存联系人个数,文件的名称
                    Person contacts[LEN];
                    int totalContactCount=0;
                    char *filePath="telbook.data";
                    
                    //定义函数,并且声明
                    void doAdd();
                    void doDelete();
                    void doUpdate();
                    void doList();
                    void doSearchByName();
                     void init();
                     void writeToFile();
                     
                     
                     int main()
                     {
                        init();
                        int flag  = 1;//退出的标志
                        int num=0;
                         while(flag){
                            
                             //编写控制程序
                            printf("\n\n**************************\n");
                            printf("****** 欢迎使用通讯录 ******\n");
                            printf("****** 1、添加联系人  ******\n");
                            printf("****** 2、删除联系人  ******\n");
                            printf("****** 3、修改联系人  ******\n");
                            printf("****** 4、查看所有联系人 ****\n");
                            printf("****** 5、搜索联系人  ******\n");
                            printf("****** 6、退出系统    ******\n");
                            printf("**************************\n\n");
                        
                            printf("请输入1-6之间的序号,选择要执行的功能\n");
                            //接收用户输入的编号
                            
                            scanf("%d",&num);
                            
                            if(num<1||num>6){
                                printf("输入错误!\n");
                                
                            }else{
                                //根据不同的编号,执行不同的功能
                                
                                switch(num){
                                    case 1:
                                        doAdd();
                                        break;
                                    case 2:
                    
                                        doDelete();
                                        break;
                                    case 3:
                    
                                        doUpdate();
                                        break;
                                    case 4:
                                        doList();
                                        break;
                                    case 5:
                    
                                        doSearchByName();
                                        break;
                                    case 6:
                    
                                        printf("正在退出系统...\n");
                                        printf("系统已经退出!\n");
                    
                                        //return 0;
                                        flag = 0;
                    
                                        break;
                    
                                    default:
                                        break;
                             
                                } 
                            }
                         } 
                         
                         return 0;
                     }
                     
                     
                     /**
                     *  添加联系人
                        1) 提示用户输入联系人信息
                        2)接收联系人信息
                        3)提示输入电话号码信息
                        4)接收电话号码
                    
                        5)让用户再次确认添加联系人    1 确认  0 取消
                        6)保存联系人信息到 联系人数组中
                        7)让联系人的个数+1
                    
                        8) 把最新的数组,重新保存到文件中
                     */
                     
                     void doAdd(){
                        printf("您正在执行的是添加联系人的操作:\n");
                        
                        //1. 提示用户输入联系人信息
                         printf("请输入联系人姓名:          [*联系人姓名中间不能又空格]\n");
                         
                         //2. 接受联系人信息
                         
                         char name[NAME_LEN];
                         char telNum[TELNUM_LEN];
                         
                         scanf("%s",name);
                         
                         //3.提示输入电话号码信息
                          printf("请输入联系人电话号码:  [*联系人号码中间不能有空格]\n");
                        //4)接收电话号码
                         scanf("%s",telNum); 
                         
                         
                         //5.让用户再确认
                            
                        int queren = 0;
                        printf("修改后联系人信息后,数据无法恢复,请确认修改:0.取消  1.确认\n");
                        scanf("%d",&queren);
                        
                        if(queren){
                            
                            strcpy(contacts[totalContactCount].name, name);
                            strcpy(contacts[totalContactCount].telNum, telNum);
                        //  strcpy(contacts[totalContactCount].name,name);
                            //strcpy(contacts[totalContactCount].telNum,telNum);
                            
                            totalContactCount++;
                            
                            writeToFile();
                        } 
                        
                        printf("添加联系人成功!\n");
                     }
                     
                     
                     
                     /**
                     *  删除联系人
                        1)提示用户输入一个要删除的联系人的编号
                        2)判断编号是否合法
                        3)再判断 要删除的元素 是否是数组的最后一个元素
                              如果是最后一个元素,总人数-1
                              如果不是最后一个元素,也就是中间的元素
                    
                              移动元素
                               i = 编号   i< 总   i++
                    
                                  a[编号-1] = a[编号]
                    
                              总人数-1
                    
                         4)同步写入到文件中
                     */
                     
                     void doDelete(){
                        printf("您正在执行的是删除联系人的操作:\n");
                        doList();
                        
                        // 1 . 提示用户输入uige要删除的联系人的编号
                         int nn;
                         printf("请输入一个要删除的联系人的编号:\n");
                         scanf("%d",&nn);
                         
                         if(nn<1||nn>totalContactCount){
                            return;
                         } 
                         
                         int queren = 0;
                         printf("联系人删除后,无法恢复,请确认是否要删除:0 取消 1 确认");
                         scanf("%d",&queren);
                         
                         if(queren){
                            if(nn==totalContactCount){
                                totalContactCount--;
                             }else{
                                for(int i = nn; i <totalContactCount;i++){
                                    contacts[i-1]=contacts[i];
                                 }
                                 totalContactCount--;
                             }
                             
                             writeToFile();
                         }
                          
                     }
                     
                     /**
                     *  修改联系人
                        1) 提示用户输入一个联系人的编号
                        2) 判断编号是否合法
                        3)让用户输入新的联系人姓名和电话
                        4) 接收用户的输入
                    
                        5)让用户再次确认删除
                        6)把原来的姓名和电话进行更新
                        7)同步保存到文件中
                     */
                     
                     void doUpdate(){
                        printf("您正在执行的是修改联系人操作:\n");
                        doList();
                        
                        int nn;
                        printf("请输入一个要修改联系人的编号:\n");
                        scanf("%d",&nn);
                        
                        if(nn<1||nn>totalContactCount){
                            return;
                         }
                         
                         char name[NAME_LEN];
                         char telNum[TELNUM_LEN];
                         
                         printf("请输入联系人的姓名:   【*联系人姓名中间不能有空格】");
                         scanf("%s",name);
                         printf("请输入联系人的电话:   【*联系人电话中间不能有空格】");
                         scanf("%s",telNum); 
                         
                         int queren = 0;
                         printf("修改后的联系人信息后,数据无法恢复,请确认修改: 0 取消 1 确认");
                         scanf("%d",&queren);
                         
                         if(queren){
                            strcpy(contacts[nn-1].name,name);
                            strcpy(contacts[nn-1].telNum,telNum);
                            
                            writeToFile();
                         } 
                     }
                     
                     
                    /**
                     *  查询所有的联系人
                        思路:
                        1)先判断 totalContactCount == 0
                          如果等于0 表示没有联系人,提示:通讯录空无一人
                    
                             不等于0 打印所有的联系人
                    
                        2)循环
                    
                        3)遍历输出所有的联系人信息
                     */
                     
                     void doList(){
                        
                        printf("您正在执行的是查询所有的联系人的操作:\n");
                        
                        if(totalContactCount==0){
                            printf("您的通信录还很寂寞!\n");
                            
                         }else{
                            printf("编号\t\t姓名\t\t电话\t\t\n");
                            for(int i = 0 ; i<totalContactCount;i++){
                                printf("%d\t\t%s\t\t%s\t\t\n",i+1,contacts[i].name,contacts[i].telNum);
                             }
                         }
                     }
                     
                     
                     
                     /**
                     * 搜索联系人
                       1) 提示用户输入一个联系人的姓名
                       2)接收这个姓名
                       3)循环,遍历数组
                          //进行字符串的比较
                          //strcmp(contacts[i].name,name) == 0
                          //如果查找到了,输出这个联系人的电话号码
                    
                          //如果没有查找到,提示:没有查找到
                    
                     */
                     
                     void doSearchByName(){
                        printf("您正在执行的是搜索联系人的操作:\n");
                        
                        char name[NAME_LEN];
                        printf("请输入联系人的姓名:  【*联系人的姓名中间不能有空格\n】");
                        scanf("%s",name);
                        
                        int i ;
                        for( i = 0 ; i < totalContactCount;i++){
                            if(strcmp(contacts[i].name,name)==0){
                                printf("您要查的联系人:%s的电话是:%s\n",name,contacts[i].telNum);
                            break;
                             }
                         } 
                         
                         if(i==totalContactCount){
                            printf("对不起没有查到%s这个人!",name); 
                         }
                     }
                     
                     
                     /**
                     *  初始化函数
                        思路:
                    
                        1)定义文件指针,并且(尝试)打开文件
                        2)如果能够打开这个文件(说明文件已经存在了)
                    
                              i.把文件中存放联系人数量读取出来
                              ii.根据联系人的数量,把联系人信息全部读取出来,放到联系人数组中
                    
                           如果文件打开失败了
                    
                              i.创建文件
                              ii.写入联系人数量  0
                    
                        3)关闭文件指针
                     */
                     
                     
                     void init(){
                        printf("系统正在初始化.......\n");
                        
                        FILE *fp = fopen(filePath,"r");
                        
                        if(fp!=NULL){
                            fread(&totalContactCount,sizeof(totalContactCount),1,fp);
                            
                            for(int i = 0 ; i < totalContactCount;i++){
                                fread(&contacts[i],sizeof(Person),1,fp);
                             }
                         }else{
                            fp = fopen(filePath,"w");
                            
                            fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);
                            printf("通讯录文件创建成功!\n");
                         }
                         fclose(fp);
                         fp=NULL;
                         printf("系统初始化完成!\n");
                     }
                     
                     /**
                     *  把数组的内容重新写入到文件中
                        1)打开文件,w
                        2)判断是否打开成功
                        3)先把联系人的数量写入到文件中
                        4)把每个联系人的数据,都写入到文件中
                    
                        5)关闭文件
                     */
                     
                     
                     void writeToFile(){
                        FILE *fp = fopen(filePath,"w");
                        if(fp!=NULL){
                            fwrite(&totalContactCount,sizeof(totalContactCount),1,fp);
                            for(int i = 0 ; i < totalContactCount;i++){
                                fwrite(&contacts[i],sizeof(Person),1,fp);
                             }
                             printf("数据更新完毕!\n");
                         }
                         fclose(fp);
                     }

相关文章

  • C语言学习之--实现文件的读写

    第三部分文件操作部分 一. c语言文件指针 定义指向一个文件的指针变量FILE *指针变量名;FILE *fp =...

  • C语言读写文件

    C语言文件读写### 标准文件读写 非标准文件读写 标准文件读写 头文件 include 打开文件 函数原型:FI...

  • C语言_文件

    @(C语言) [toc] 读文件 写文件 读写二进制文件

  • C语言读写文件

    从键盘输入字符后,写入到磁盘文件datafile1.txt中 读出磁盘文件datafile.txt中的内容,将它们...

  • C语言读写文件

    fread函数和fwrite函数 1.函数功能 用来读写一个数据块。 2.一般调用形式 fread(buffer,...

  • C语言读写文件

    C读写文件 使用 fopen(文件名,访问模式) 函数来打开文件,一般有getc/putc , fgets/fpu...

  • 【NDK 7】 c/c++ 文件和流操作

    C 语言的文件读写操作 头文件 : stdio.h 函数原型:FILE * fopen(const char * ...

  • Python:文件的读写

    任何编程语言都会涉及到文件的读写操作,在python中文件的读写与c语言有异曲同工之妙。 在对文件的处理中,一般分...

  • pread()函数

    C语言lseek()函数:移动文件的读写位置 头文件: #include #include 定义函数: off_t...

  • C语言文件读写方法

    [TOC] fwrite size_t fwrite ( const void * ptr, size_t siz...

网友评论

    本文标题:C语言学习之--实现文件的读写

    本文链接:https://www.haomeiwen.com/subject/jwgbittx.html