文件操作学习笔记

该文章是对文件操作主要知识点进行总结以及对于一些细节知识的备注。

2024/02/29

  1. 文件可以分为两类:程序文件和数据文件
  2. C语言如何处理文件:
    当程序打开一个文件时,会在内存里开辟一个FILE的结构体,这个结构体里包括了各种文件的信息。当需要对文件进行修改的时候,编程者使用FILE*对FILE这个结构体进行修改,从而对硬盘中的文件进行修改
  3. #include <stdio.h>
    FILE* pf = fopen(“data.txt”, “r”);
    if(pf==NULL)
    {
        perror(“fopen”);
    }
    “r”, 如果文件路径下没有这个文件会报错
    “w” and “a” 如果文件路径下没有这个文件会创建该文件
    “w”打开一个已存在的文件,会将该文件清空
    fopen第一个参数可以为相对路径或者为绝对路径,输入绝对路径时,记得将’\’转义,在字符串里’\\’才代表字符 \
    . 代表为当前路径
    .. 代表为当前路径的上一级目录

    fclose(pf);
    pf = NULL; //记得将pf置为空指针
  4. 补充一个知识点。
    当c语言读写一个文件的时候,需要打开文件,读写文件,关闭文件。而c语言程序在调用scanf和printf时,在程序员自己写的代码里并没有看到打开键盘打开显示器。这是因为在执行C语言程序时,会默认打开三个流:
    标准输入流 stdin      FILE*
    标准输出流 stdout    FILE*
    标准错误流 stderr     FILE*
    流是一个抽象化的概念。因为电脑有许多的外设,类似于键盘鼠标摄像头显示器等等,如何处理外设输入输出的各种信号,这对于程序员的要求太高了。由于上诉的问题,编程里抽象出一个流的概念,程序员只需要从流里读数据,将数据写到流里,至于流如何和外部设备交互,则由C语言和操作系统来实现
    输入输出是相较于程序来讲的,主体是程序
  5. fputc( , );
    第一个参数是int character,第二个参数是FILE* stream,如果第二个参数为stdout,就是打印到屏幕上了

    fgetc();
    参数为FILE*,函数调用第一次时,读取第一个字符,调用第二次的时候读取第二个,以此类推。
    fgetc(stdin); 输入stdin是从键盘上读

    fputs( , );
    输入一行字符串,但是需要自己手动换行,需要在字符串末尾加’\n’
    fopen打开txt文件后,返回FILE*, fputs会从文件开头开始写入,会覆盖之前的文档。如果在代码里fclose了文件,再fopen,再fputs,也会从头覆写内容
    第二个参数输入stdout,会打印到屏幕上

    fgets( , , );
    char* fgets(char* str, int num, FILE* stream);
    一共有三个参数,第一个参数是,将文件中读取的字符串放置的位置,第二个是读的字符个数,但是字符个数是num-1,因为还有个位置要放’\0’。
    该函数是这样运作的,第一次调用读取文件中的字符串,如果num刚好大于文件中第一行的字符串个数,该函数只会读到’\n’停止,并在str最后加‘\0‘,调用第二次该函数的时候才会从第二行读起,所以如果要读取第二行字符的话,至少要等到fgets函数调用的第二次
    如果num大于第一行的字符数的个数,读取到’\n’就会停止读取,不会读到下一行的内容

    fprintf(FILE* stream , “  “ , ……);
    调用这个函数是将数据写到txt文件里
    stdout输出到屏幕上
    返回值是int

    fscanf(FILE* stream , “  “ , ……);
    调用这个函数是将数据从txt文件里读出, 第三个参数位置要输入&..,需要输入地址
    返回值也是int
  6. printf      标准输出流
    scanf      标准输出流

    fprintf   所有输出流
    fscanf   所有输入流

    sprintf    将格式化的数据,转化为字符串
    sscanf    将字符串转换为格式化的数据
    struct S
    {
        int a;
        float s;
        char str[10];
    }
    int main()
    {
        char arr[30] = {0};
        struct S stu = {100, 3.14f, “hello”};
        struct S tmp = {0};
        sprintf(arr, “%d %f %s”, stu.a, stu.s, stu.str);
        sscanf(arr, “%d %f %s”, &(tmp.a), &(tmp.s), tmp.str); //str不用取地址,因为字符串本身就是首字符的地址
    }
  7. fwrite();
    size_t fwrite( const void* ptr, size_t size, size_t count, FILE* stream);
    对文件进行二进制读写的时候,fopen第二个参数要改为”wb”
    fwrite返回的值是有可能会小于count的,fwrite写了几个数据就返回几个

    fread();
    参数与fwrite()完全相同
  8. 通讯录再次更新
    SaveContact();
    LoadContact();
  9. fseek();
    这个函数是用来定位文件指针的
    int fseek (FILE* stream, long int offset, int origin);
    这个函数不是改变FILE*指针的位置,FILE*指针如上文所述,它是指向一个FILE结构体,这个函数会改变FILE结构体里的内容
    SEEK_SET
    这个位置是file的起始位置,需要输入offset>0,将文件内容指针向后移动
    SEEK_END
    这个位置是file的结束位置,需要输入offset<0,将文件内容指针向前移动
    SEEK_CUR
    举个例子,fgetc(),调用这个函数是会改变文件内容指针的位置的,SEEK_CUR会因此发生改变,调用fseek函数,如果第三个参数为SEEK_CUR,offset会在SEEK_CUR的基础上改变文件内容指针的位置
    offset , 如果file文件是个字符串的话,offset>0是向右偏移,如果<0是向左偏移

    ftell()
    该函数只有一个参数,FILE*stream
    会输出当前文件指针相对于初始位置的偏移量

    rewind();
    参数为FILE* stream
    直接将文件指针返回文件起始位置
    也可以用 fseek(pf, 0, SEEK_SET);
  10. 二进制文件和文本文件
    二进制文件已二进制存储
    文本文件以char类型存储
  11. feof()
    feof() 是用来判断文件读取结束的原因的,文件读取结束不一定是遇到了文件末尾,也有可能是遇到了其他错误
    feof(pf);     返回非0,表示pf到达文件末尾
    ferror(pf);  返回非0,表示pf读取遇到了错误
    而判断文件是否读取到末尾可以用以下三种方法:
    1. fgetc() 返回值为EOF
    2. fgets() 返回NULL
    3. fread() fread有四个参数,其中有个size_t count,如果返回值int小于count,那么文件指针到达文件末尾
  12. 文件缓冲区:
    程序数据区       输出缓冲区        硬盘
                              输入缓冲区
    该机制是为了提高cpu的使用效率,程序不是直接将输入内容直接写到硬盘上,而是会先存放在输出缓冲区上,fflush和fclose执行的时候,都会强制将缓冲区的内容写到硬盘上。因为有文件缓冲区的存在,如果要将数据存放到硬盘当中,要么刷新缓冲区,要么一定要fclose文件一下
    fflush(pf)
    缓冲也有好几种实现方式,在操作系统时候学习

2024/03/13

  1. 以“r”fopen文件后,需要判断文件指针是否为空,因为当文件不存在时,fopen也会返回NULL
  2. 使用fopen,需要对文件指针进行判空
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值