详解文件操作

Posted 王不患吖吖吖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解文件操作相关的知识,希望对你有一定的参考价值。

什么是文件

  • 程序文件
    源程序文件.c 目标文件.obj 可执行文件.exe
  • 数据文件

就是指程序运行时要读取或者输出数据的文件
我们经常会把信息放在磁盘上,当需要的时候就把磁盘的数据读到内存中再使用,或者把信息输入到磁盘里边。这就是文件的操作。

文件类型

  • 文本文件—例如整数10000,(一个字符占一个字节)它是以ACLL形式进行存储,内存中占有5个字节
  • 二进制文件—还是10000,内存中以二进制存储 10 27 00 00,一个整数,占四个字节

文件指针

每一个被使用的文件都在内存中开辟了一个相应的文件信息区,这个信息区里边会存储文件的相关信息,例如文件状态,文件的当前位置,这些信息保存在一个结构体变量里边,结构体变量的类型由系统声明,为FILE

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

我们一般通过FILE的指针来维护这个结构体的变量。

FILE *pf;

每一个指针变量指向一个文件,
也就是说我们可以通过这个指针来操作相关的文件。

文件的打开与关闭

在操作某一个文件的时候我们先进行打开,然后一定要进行关闭
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );

其中有很多种打开方式

为什么要关闭文件

文件缓冲区
就是说程序数据向输入到磁盘中,要先输入到输出缓冲区,磁盘的文件要输出到程序数据区,要先把它输出到输入缓冲区。缓冲区的数据被装满才能进行下一步操作。如果我们不想让它装满才进行下一步操作。我们需要刷新缓冲区,或者关闭文件才行,所以我们要关闭文件。

一组函数

scanf/fscanf/sscanf
printf/fprintf/sprintf

scanf–从标准输入流(键盘)读取格式化的数据
fscanf–从所有的输入流读取格式化的数据
sscanf–读一个格式化的数据到字符串里边
printf–输入格式化的数据到标准输出流(屏幕)
fprintf–写一个格式化的数据到所有输入流
sprintf–写一个字符串数据到所有输出流



文件的随机读写

feek
根据文件指针的位置和偏移量来定位文件指针

int fseek ( FILE * stream, long int offset, int origin );

*steam 文件的指针
offset 偏移量(字节)
origin 初始位置

记住几个常用的

文件的开始位置,文件的当前指针,文件的结束
例子

定位文件指针然后可以替换里边的内容

ftell

返回文件的随机偏移量

long int ftell ( FILE * stream );

rewind

让文件指针回到文件的起始位置

void rewind(FILE *steam);

文件结束判定

feof
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  1. 文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)
    例如:
    fgetc判断是否为EOF.
    fgets判断返回值是否为NULL.
  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数。
    正确的使用:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int c; // 注意:int,非char,要求处理EOF
    FILE* fp = fopen("test.txt", "r");
    if(!fp) {
        perror("File opening failed");
        return EXIT_FAILURE;
   }
 //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
    while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
   { 
       putchar(c);
   }
 //判断是什么原因结束的
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

以上是关于详解文件操作的主要内容,如果未能解决你的问题,请参考以下文章

线段树详解

VSCode自定义代码片段——git命令操作一个完整流程

20160206.CCPP体系详解(0016天)

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode 如何操作用户自定义代码片段(快捷键)