文件操作_C语言快速入门与计算机二级备考

文件的分类

二进制文件

  • 所有的文件最终都是二进制的
  • 二进制人类读写困难,而且不跨平台(因为在不同平台上int的大小不同,数据储存分大小端这些问题),但程序读写二进制文件比较快
  • 为了克服二进制文件的不可移植性,可以不使用int而使用typedef有明确大小的类型(如uint8_t之类);最好使用文本文件

文本文件

  • 文本文件是可以以最简单方式读写的文件(而二进制文件需要用专门的程序来读写)

    文本方便人类读写,并且能跨平台,但程序输入输出要经过格式化,开销大

文件输入输出

  • linux终端上特殊的方式:对于有scanf作输入,printf作输出的程序

    我们可以用<指定程序的输入,>指定程序的输出,这样将输入输出都变为了文件

    程序 < 输入文件 程序 > 输出文件

  • <stdio.h>已经包含file这个类型的指针,用于文件操作

打开文件

打开文件函数

  • fopen("file","r")

    将程序中要读写的文件和磁盘上实际的数据文件联系

    打开一个文件成功时,函数会返回一个FILE类型的指针,错误时则返回NULL

    • 包含两个引号内的参数:

      第一个参数"file" 表示文件的路径(需要确保路径存在)

      第二个参数"r"表示该函数的模式

文件打开模式

  • r打开只读;

    r+打开读写;

  • w打开只写,如果不存在则新建,存在则清空

    w+打开读写,如果不存在则新建,存在则清空

  • a打开追加,如果不存在则新建,存在则从文件尾开始

    a+打开可读并且可追加

  • x只新建,如果文件存在则不能打开,不会覆盖原有文件

    可以与其他模式共同使用,比如wx

  • 后缀b打开二进制文件,比如wb

文件的读写

读取文件函数

  • fscanf

    fscanf(文件指针,“……”,&读取后要写入的变量)

    • scanf的文件版本,只是在前面多一个指向文件的指针的参数

    • 双引号中间是格式字符串,用于控制输入格式,如下:

      fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
      
    • 返回值是成功读取的个数

  • fread

    fread(保存读取结果的空间的指针,读取的每个元素大小(字节为单位),读取元素数量, 文件指针);

    • 需要在参数表中写入读取数据项的大小,例如:

      FILE *fp;
      char str[] = "test";
      fp = fopen("file.txt", "w+");
      
      fread(buffer, strlen(str)+1, 1, fp);
      //如此,fp所指文件被写入字符串str
      fclose(fp);
      
    • 适用于结构的读写,中间的两个参数分别用于表示结构的大小和表示要读取几个结构

    • 返回值是成功读写的字节数,失败则返回EOF

  • fgets

    fgets(保存读到字符的变量,需要读的字符数,文件指针)

    • gets的文件版本

    • 用于读取指定数量字符到字符串,当读到规定数量或换行符时停止,成功时将返回字符串

    • 读取文件的实例:

      #define N 100
      char str[N+1];
      while(fgets(str, N, fp) != NULL){
              printf("%s", str);
      }//当100个元素内的字符不为空时,不断将fp所指文件中内容读到str中
      
  • fgetc

    fgetc(文件指针)

    • 读取一个字符,getchar的文件版本

    • 读取文件的实例:

      char ch;
      while ((ch = fgetc(file)) != EOF) {
          printf("Character read: %c\n", ch);
      }
      

输出至文件

  • fprintf

    int fprintf(文件指针, “……”, ...);

    • 双引号之间写入格式字符串,后面为根据格式字符串所需的可变参数列表,类似于 printf 的格式字符串

    • 用于写入格式化文本,适用于需要格式化输出的场景

    • fscanf相对

  • fwrite

    fwrite(指向要写入数据的指针, 每个元素的大小(字节为单位), 元素数量, 文件指针);

    • 用于写入二进制数据块,适用于结构体的写入以及大规模数据传输
    • fread相对
  • fputs

    fputs("要写入的字符串", 文件指针);

    • fgets相对
  • fputc

    fputc(要写入的字符(类型为整数), 文件指针);

    • 用于写入单个字符,适用于逐字符处理
    • fgetc相对

在文件中定位

  • fseek

    fseek(指向文件的指针,第几个L,从哪一遍算起);

    • 有三个参数可决定寻找从哪一边开始:

      SEEK_SET从头开始;SEEK_CUR从当前位置开始;SEEK_END从尾开始

  • ftell

    ftell(指向文件的指针);

    • 用于返回当前文件所指的位置
  • rewind

    rewind(指向文件的指针);

    • 用于将文件指针重新定位到文件开头
  • feof

    feof(指向文件的指针);

    • 判断文件是否结束
  • 利用定位检测文件大小
    fseek(fp,0L,SEEK_END);//从尾开始移动0个L -> 移到文件末尾
    long size=ftell(fp);//size变量此时等于整个文件字节大小
    int num=size/sizeof(struct A a);//num为整个文件中结构的数量
    

关闭文件

  • fclose

    fclose(指针) 关闭文件函数

    参数为所要关闭的文件的指针

  • EOF

    EOF是文本文件结束的标志,其值为-1

    在读取文件失败时,读取文件函数也会返回EOF

使用文件实例

  • 打开文件的标准代码

    FILE* fp=fopen("file","r");//创建一个指向文件的指针fp
    //"file"表示文件所在路径,"r"表示函数当前的模式
    //倘若文件无法被正常打开,函数将会返回Null,因此需要判断文件能否打开
    if (fp){
    	int num;
    	fscanf(fp,"%d",&num);//读取文件内容,写入变量num
    	printf("%d\n",num);
    	fclose(fp);//关闭文件
    }else{
    	printf("无法打开文件\n");
    }
    
posted @ 2024-11-15 14:02  无术师  阅读(53)  评论(0)    收藏  举报