美文网首页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语言学习之--实现文件的读写

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