• DAY14 文件和makefile


    文件

    概述

    描述

    文件用来存放程序、文档、音频、视频数据、图片等数据的。
    文件就是存放在磁盘上的,一些数据的集合。
    分类
       
    磁盘文件
    word,pdf,txt, 编写的 .c 文件 , 编译的 .o 文件 , 压缩包等
    二进制文件
    : 音频 , 视频 , 图片
    基于值编码 , 需要特定程序打开
    文本文件
    :txt 文件
    基于字符编码,常见编码有 ASCII UNICODE
    一般可以使用文本编辑器直接打开
    设备文件
    接入电脑的外设 , 如屏幕 , 键盘 , 鼠标 ,U 盘等
    注意 :
    键盘:标准输入文件 屏幕:标准输出文件

    缓冲区

    文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存
    放在哪里 .
    优点 :
    提高其读写效率
    缓冲区到文件或程序的情况
    行缓冲
    有换行就缓冲
    #include
    int main(int argc, char const *argv[])
    {
    printf(" 德玛西亚 \n");
    while(1);
    return 0;
    }
    满缓冲
    当缓冲区中的内容满了后 , 将冲刷
    强制缓冲
    手动调用 fflush 函数
    fflush( 文件指针 );
    stdio 提供的文件指针
    stdout: 标准输出
    stdin: 标准输入
    stderr: 错误输出
    #include
    int main(int argc, char const *argv[])
    {
    printf(" 德玛西亚 ");
    fflush(stdout);// 强制缓冲 ,stdout: 标准输出 ,stdin: 标准输入 ,stdio.h
    提供的
    while(1);
    return 0;
    }
    关闭缓冲
    #include
    int main(int argc, char const *argv[])
    {
    printf(" 德玛西亚 ");
    return 0;
    }
    无缓冲
    没有缓冲区
    在读写文件的时候通过系统调用 io read write , 对文件进行读写数据
    这个时候是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存

    文件指针

    概述

    存储文件地址的指针变量
    文件指针在程序中用来标示(代表)一个文件的,在打开文件的时候得到文件指针
    操作步骤
    1, 打开文件获取文件指针
    2, 操作文件指针
    3, 关闭文件
    文件指针指向的变量是 FILE 结构体的变量
    FILE 结构体在 stdio 中定义的 , 如下
    typedef struct
    short level; // 缓冲区 的程度
    unsigned flags; // 文件状态标志
    char fd; // 文件描述符
    unsigned charhold; // 如无缓冲区不读取字符
    short bsize; // 缓冲区的大小
    unsigned char *buffer; // 数据缓冲区的位置
    unsigned ar*curp; // 指针,当前的指向
    unsigned istemp; // 临时文件,指示器
    shorttoken; // 用于有效性检查
    FILE

    相关函数

    fopen打开文件

    语法

    FILE *fopen(const char *path, const char *mode)
    参数 :
    path: 要打开的文件地址
    注意 : 可以是相对路径也可以是绝对路径
    mode:
    r: 只读
    w: 只写 , 如果文件存在 , 清空原文件中的内容 , 在写入 , 如果文件不存在 , 新建文
    , 在写入
    a: 追加 , 如果文件存在 , 在原文件内容尾部写入 , 如果文件不存在 , 新建文件 ,
    写入
    rb: 二进制读取
    wb: 二进制写入
    ab: 二进制追加
    r+: 可读可写 , 不会创建新文件
    w+: 可读可写 , 会创建新文件
    a+: 可读可写追加
    rb+
    wb+
    ab+
    返回值 :
    打开的文件对应的文件指针
    如果为 NULL, 打开失败
    fclose 关闭文件
    语法
    int fclose(FILE *fp);
    参数 :
    fp: 要关闭的文件指针
    返回值 :
    0 成功 , 0 失败
    fflush 冲刷缓冲区
    语法
    int fflush(FILE *stream);
    参数 :
    stream: 要冲刷的文件指针
    fgetc fputc
    fgetc
    作用 : 从文件中一次读取一个字节
    语法 :
    int fgetc(FILE *stream);
    参数 :
    stream: 要读取的文件指针
    返回值 :
    读取到的字符
    读取结束或失败
    文本文件返回 EOF
    EOF stdio.h 文件提供的一个符号常量 , 值是 -1
    二进制文件返回 feof( 后面会讲 )
    fputc
    作用 : 一次给文件中写入一个字节
    语法 :
    int fputc(int c, FILE *stream)
    参数 :
    c: 写入的字符
    stream: 写入的文件对应的指针
    返回值:
    如果输出成功,则返回输出的字节值;
    如果输出失败,则返回一个 EOF
    fgets fputs
    fgets
    函数头 :
    stdio.h
    函数 :
    char *fgets(char* s,int size,FILE *stream);
    参数 :
    s: 存储读取到的字符串的变量
    size: 这是要读取的最大字符数 ( 包括最后的空字符 ) 。通常是使用以 str 传递的数
    组长度。
    stream: 读取的文件指针
    返回值 :
    成功返回读取的字符
    失败返回 NULL
    注意 :
    读取到换行或文件结束
    fputs
    函数头 :
    stdio.h
    函数 :
    int fputs(const char *s, FILE *stream);
    参数 :
    s: 写入的字符串
    stream: 写入的文件指针
    返回值 :
    成功返回写入的字节数
    失败返回 -1
    fread fwrite
    fread
    作用 : 一次读一块 , 主要用于文件传输
    函数
    函数头
    stdio.h
    函数
    size_t fwrite(viod *ptr,size_t size,size_t nmemb,FILE *stream)
    参数 :
    ptr: 指向带有最小尺寸的 size*nmemb 字节的内存块的指针
    size: 读取的每个元素的大小 , 单位字节
    nmemb: 读取的元素个数
    stream: 读取的文件指针
    返回值 :
    实际读到的块数。
    fwrite
    作用 : 一次写一块 , 主要用于文件传输
    函数
    函数头
    stdio.h
    函数
    size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
    参数 :
    ptr: 这是指向要被写入的元素数组的指针。
    size: 这是要被写入的每个元素的大小,以字节为单位。
    nmemb: 这是元素的个数,每个元素的大小为 size 字节。
    stream: 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
    返回值 :
    实际写入的块数
    示例
    #include
    struct STU
    {
    char name [ 20 ];
    int age ;
    char sex [ 10 ];
    };
    void write (){
    FILE * stuF = fopen ( "stuinfo" , "w" );
    if ( stuF == NULL )
    {
    printf ( " 文件不存在 " );
    return ;
    }
    struct STU stus [ 3 ];
    for ( int i = 0 ; i < 3 ; i ++ )
    {
    printf ( " 请输入第 %d 个学员信息 , 格式为 : 姓名 年龄 性别 \n" , i + 1 );
    // 数组名存储的就是数组第一个元素的地址 , 本身就是一个指针
    scanf ( "%s %d %s" , stus [ i ]. name , & stus [ i ]. age , stus [ i ]. sex );
    }
    int num = fwrite ( stus , sizeof ( struct STU ), 3 , stuF );
    fclose ( stuF );
    printf ( "OVER,num:%d\n" , num );
    }
    // 全局变量数组中的数据默认为 0
    struct STU stus [ 10 ];
    void read ()
    {
    FILE * f = fopen ( "stuinfo.txt" , "r" );
    fread ( stus , sizeof ( struct STU ), 10 , f );
    fclose ( f );
    for ( int i = 0 ; i < 10 ; i ++ )
    {
    printf ( "%s %d %s\n" , stus [ i ]. name , stus [ i ]. age , stus [ i ]. sex );
    }
    }
    int main ( int argc , char const * argv [])
    {
    read ();
    return 0 ;
    }
    fscanf fprintf
    fscanf
    作用 : 从文件中格式化读取
    函数
    函数头 :
    stdio.h
    函数 :
    int fscanf(FILE *stream, const char *format, ...)
    参数 :
    stream: 文件指针
    format: 格式化字符串
    ...: 输入数据列表
    返回值 :
    成功 : 该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误 , 则返回
    EOF
    fprintf
    作用 : 给文件中格式化写入
    函数
    函数头 :
    stdio.h
    函数
    int fprintf(FILE *stream, const char *format, ...)
    参数 :
    stream: 文件指针
    format: 格式化字符串
    ...: 输出数据列表
    返回值 :
    成功 : 则返回写入的字符总数 ,
    失败 : 返回一个负数。
    补充:
    以上读写称为顺序读写 , 文件读写的位置在上一次之后
    以下读写称为随机读写 , 文件读写的位置可以发生改变
    rewind 复位
    作用 : 设定文件位置为文件开头
    函数
    函数头
    stdio.h
    函数
    void rewind(FILE *stream)
    参数
    指针文件
    示例:
    #include
    int main ( int argc , char const * argv [])
    {
    FILE * f = fopen ( "a.txt" , "r" );
    char str [ 50 ];
    fgets ( str , sizeof ( str ), f );
    printf ( "%s" , str );
    rewind ( f );
    fgets ( str , sizeof ( str ), f );
    printf ( "%s" , str );
    return 0 ;
    }
    fseek 定位
    作用 : 设置文件指针位置
    函数
    函数头 :
    stdio.h
    函数 :
    int fseek(FILE *stream, long int offset, int whence)
    参数 :
    stream: 文件指针
    offset: 相对于 whence 的偏移量
    whence: 位置 ,0, 开始 ,1, 当前位置 ,2, 结尾
    ftell
    作用 : 获取指针偏移量 , 测量文件读写位置距文件开始有多少字节
    函数
    函数头 :
    stdio.h
    函数 :
    long int ftell(FILE *stream)
    参数 :
    文件指针
    返回值 :
    文件读写位置距文件开始的字节数

    makefile

    问题
    当编译程序时所需的源文件或连接的库文件过渡 , 导致编译命令过长
    每次书写困难
    为了简化其操作系统提供了 gnu make
    检查 GNU make 是否存在
    which make
    make --version
    make makefile
    EXEC = main
    OBJ = main.o utils.o
    FLAGS = -Wall -g
    CC = gcc
    $(EXEC) : $(OBJ)
    $(CC) $(OBJ) -o $(EXEC) $(-Wall -g)
    main.o: main.c
    $(CC) -c main.c -o main.o
    utils.o: utils.c
    $(CC) -c utils.c -o utils.o
    clear:
    rm $(EXEC) *.o
  • 相关阅读:
    448. 找到所有数组中消失的数字
    多人协作多版本开发冲突的正确解决姿势
    时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)
    3、IO流之字节流和字符流
    如何在小程序中给会员设置备注
    燕之屋通过港交所聆讯:苦战IPO十余年,黄健等人提前精准套现
    【LeetCode】每日一题:使二叉树所有路径值相等的最小代价
    加密行业焦点:本周五,关注灰度GBTC转型是否有解?
    TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下
    关于苏州立讯公司国产替代案例(使用我公司H82409S网络变压器和E1152E01A-YG网口连接器产品)
  • 原文地址:https://blog.csdn.net/aisheisadas/article/details/134317059