zoukankan      html  css  js  c++  java
  • c语言文件的基本操作

    c语言对文件的操作主要分为:按字符操作,按行操作,按内存块操作

    主要的函数:

    fopen():

      FILE * fopen(_In_z_ const char * _Filename, _In_z_ const char * _Mode);

      第一个参数是文件的绝对路径名(包含文件),第二个是文件的打开方式,Mode(方式)意义如下:

      "r" 打开一个用于读取的文本文件

      "w" 创建一个用于写入的文本文件

      "a" 附加到一个文本文件

       "rb" 打开一个用于读取的二进制文件

      "wb" 创建一个用于写入的二进制文件

      "ab" 附加到一个二进制文件

      "r+" 打开一个用于读/写的文本文件

      "w+" 创建一个用于读/写的文本文件

      "a+" 打开一个用于读/写的文本文件

      "rb+" 打开一个用于读/写的二进制文件

      "wb+" 创建一个用于读/写的二进制文件

      "ab+" 打开一个用于读/写的二进制文件

    fclose():关闭文件资源

    一、按字符:其实就是从文件中一个个读出字符出来

    头文件:

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>

    函数原型:

    void writeFile(char *fileRealName, char *writeStr); //将一个字符串写入某个文件中

    void readFile(char *fileRealName); //读取文件

    实现方法:

    void readFile(char *fileRealName){
    
        FILE *pf = NULL;
    
        pf = fopen(fileRealName, "r+");
    
        if(pf == NULL){
            printf("文件不存在");
            return;
        }
    
        while (!feof(pf)){
    
            printf("%c", fgetc(pf));
        }
        fclose(pf);
    }

    测试写入文件:

    int main(){
    
        writeFile("c:/1.txt", "fdweqfefwef");
        system("pause");
        return 0;
    }

    运行结果:

    测试读取文件:

    int main(){
        readFile("c:/1.txt");
        system("pause");
        return 0;
    }

    运行结果:

    二、按行操作:

    头文件跟上面一样

    函数原型:

    void readLine(const char *fileRealName);// 读取一行
    
    void writeLine(const char *fileRealName, const char *writeLine);写入一行

    实现方法:

    void readLine(const char *fileRealName){
        FILE *pf = NULL;
    
        char rl[1024];
    
        char *p = NULL;
    
        pf = fopen(fileRealName, "r+");
    
        if(pf == NULL){
            printf("文件不存在");
            return;
        }
        
        while(!feof(pf)){
            
            p = fgets(rl, 1024, pf);
    
            if(p == NULL)
                goto end;
    
            printf("%s", rl);
        }
    
        end :
            fclose(pf);
    }
    
    void writeLine(const char *fileRealName, const char *writeLine){
        
        FILE *pf = NULL;
    
        pf = fopen(fileRealName, "r+");
    
        if(pf == NULL){
            printf("文件不存在");
            return;
        }
    
        fputs(writeLine, pf);
    
        fclose(pf);
    }

    写入测试就不做了,跟字符操作一样

    读取测试:

    文本文档为:

    ggg
    3456
    zhang
    张三
    李四

    int main(){
    
        readLine("c:/1.txt");
    
        system("pause");
        return 0;
    }

    运行结果:

    三、按照内存块操作:

    头文件一样,全局变量:

    typedef struct Teacher{
        int id;
        char name[64];
    }Teacher;

    函数原型:

    void writeTeachers(const Teacher *ts, int len, char *fileRealName);//将数组写入二进制文件中
    
    int readTeachers(Teacher **ts, char *fileRealName);//从二进制文件中读取数据并且创建一个数组来存储,返回值为数组的长度

    void printTeacher(Teacher *ts, int len); //遍历数组

    实现方法:

     1 void writeTeachers(const Teacher *ts, int len, char *fileRealName){
     2 
     3     FILE *pf;
     4     int count, i;
     5 
     6     pf = fopen(fileRealName, "wb"); //创建一个二进制文件
     7 
     8     if(pf == NULL)
     9         printf("open error!
    ");
    10 
    11     for (i = 0; i < len; i++){
    12         count = fwrite(&(ts[i]), sizeof(Teacher), 1, pf); // fwrite()函数人参数分别是写入变量的地址,写入变量的大小,复制多少次(大于一次会顺序存储到该地址后面),文件句柄;返回值是复制成功的次数,如果成功则返回第三个参数的值,反之返回0
    13         printf("%d
    ", count);
    14     }
    15 
    16     fclose(pf);
    17 }
    18 /*
    19 返回值是读取教师数组的元素个数,教师数组由函数分配内存
    20 */
    21 int readTeachers(Teacher **ts, char *fileRealName){
    22 
    23     FILE *pf;
    24     int count = 0 ,len = 0;
    25     Teacher *temp = NULL;
    26     Teacher *pt = NULL;
    27 
    28     pf = fopen(fileRealName, "rb+");//打开一个二进制文件
    29 
    30     if(pf == NULL)
    31         printf("open error!
    ");
    32 
    33     temp = (Teacher*)malloc(sizeof(Teacher));
    34 
    35     do{
    36         count = fread(temp, sizeof(Teacher), 1, pf);
    37         len++;
    38     }while(count != 0);
    39 
    40     len--; //获得该文件存储的数组的长度
    41 
    42     if(temp != NULL){
    43         free(temp);
    44         temp = NULL;
    45     }
    46 
    47     rewind(pf);//将文件指针重新指向文件开头
    48     pt = (Teacher *)malloc(sizeof(Teacher) * len);
    49 
    50     for(count = 0; count < len; ++count){
    51         fread(&(pt[count]), sizeof(Teacher), 1, pf);//fread()函数跟fwrite函数极为类似,参照上面的注释
    52         printf("第%d位教师 编号 %d 姓名 %s
    ", count + 1, pt[count].id, pt[count].name);
    53     }
    54 
    55     fclose(pf);
    56     *ts = pt;
    57     return len;
    58 }
    59 
    60 void printTeacher(Teacher *ts, int len){
    61     
    62     int i;
    63 
    64     for(i = 0; i < len; ++i){
    65         printf("第%d位教师 编号 %d 姓名 %s
    ", i + 1, ts[i].id, ts[i].name);
    66     }
    67 }

    测试写:

    int main(){
    
        Teacher ts[3];
        int i;
    
        for (i = 0; i < 3; i++){
            ts[i].id = 1000 + i;
            sprintf(ts[i].name, "zhangsan%d", i + 1);
        }
    
        writeTeachers(ts, 3, "c:/2.data");
    
        system("pause");
        return 0;
    }

    最终生成一个二进制文件

    测试读:

    int main(){
    
        Teacher *ts = NULL;
        int len = 0;
    
        len = readTeachers(&ts, "c:/2.data");
    
        printTeacher(ts, len);
        if(ts != NULL){
            free(ts);
            ts = NULL;
        }
        system("pause");
        return 0;
    }

    运行结果:

  • 相关阅读:
    shell中test命令方法详解
    Linux 查看端口使用情况
    jboss 报错处理及端口修改
    jboss的使用和安装
    python 关于列表的增删改查及个别的命令
    Cisco Cat4500系列High CPU故障步骤摘要
    Services: ARP Caching
    Passive Client Feature
    BGP前缀过滤(正则表达式)
    Cisco Spectrum Expert(Wave2 AP)
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/6241528.html
Copyright © 2011-2022 走看看