12、【C语言基础】文件读写

一、C文件概述

  文件:存储在外部介质上的数据的集合,是操作系统数据管理的单位。

  使用数据文件的目的

    1、数据文件的改的不影响程序的改动--程序与数据分离

    2、不同程序可以访问同一数据文件中的数据--数据共享

    3、能长期保存程序运行的中间数据或结果数据

二、文件的分类

  1、按存储介质:

    普通文件:存储介质文件(磁盘、磁带等)

    设备文件:非存储介质(键盘、显示器、打印机等)  

  2、按数据的组织形式

    文本文件:ASCII文件,每个字节存放一个字符的ASCII码

    二进制文件:数据按其在内存中的存储形式原样存放

  3、C语言的文件时流式文件

    所谓流就是一系列的字节或者字符,输入输出数据流的开始和结束仅受程序控制,而不受物理符号(如回车符)的控制。这种文件称为流式文件

  4、文件处理方法:

    缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区,可减少主机和外部设备频繁交换数据的次数。

    非缓冲文件系统:低级文件系统,由用户在程序中为每个文件开辟缓冲区。

三、文件类型的指针

  1、文件结构体类型FILE

    缓冲文件系统为每个正在使用的文件在内存中开辟文件信息区

    文件信息用系统定义的名为FILE的结构体描述

    在stdio.h文件中有以下的文件类型声明:

 1 typedef struct
 2 {
 3     short level;             /*缓冲区“满”或“空”的程度*/
 4     unsigned flags;          /*文件状态标志*/
 5     char fd;                 /*文件描述符*/
 6     unsigned char hold;      /*如无缓冲区不读取字符*/
 7     short bsizse;            /*缓冲区的大小*/
 8     unsigned char *buffer;   /*数据缓冲区的位置*/
 9     unsigned char *curp;       /*指针,当前的指向*/
10     unsigned istemp;         /*临时文件,指示器*/
11     short token;             /*用于有效性检查*/
12 }FILE;

 2、定义文件类型变量

    存放文件的信息

    如:定义FILE类型数组,存放若干文件信息:FILE f[5];

    定义文件类型指针变量,指向FILE类型结构体变量,通过该结构体变量中的文件信息访问文件。

    如:FILE *fp;

四、文件的打开与关闭

  C文件操作用库函数实现,包含在stdio.h

  1、文件使用方式:打开文件--文件读写---关闭文件

  2、文件打开(fopen函数)

    函数原型:FILE *fopen(char *name, char *mode)

    调用方式:fopen(“文件名”,“使用文件方式”)

      例如:FILE *fp;

      fp = fopen("d:\user\myfile.txt","r");

    返回值:正常打开,返回指向文件结构体的指针,打开失败,返回NULL

    注:(文件的几种操作方式)

模式描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

  3、文件的关闭(fclose函数)

    作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针

    返回值:用于表示文件是否被正常关闭,如果文件顺利关闭,该值为0;否则为-1(EOF)

        返回值可以用ferror函数测试

  4、文件的读写

    文件打开之后,就可以对它进行读写操作

  (1)读/写文件中的一个字符

      fputc函数(putc函数)----写

      函数原型:int fputc(int c,FILE *fp)

      功能:把一字节代码c写入fp指向的文件中

      返回值:正常,返回c,出错,为EOF

      fgetc函数(getc)

      函数原型:int fgetc(FILE *fp)

      功能:从fp指向的文件中读取一字节代码

      返回值:返回独到的代码值,独到文件尾或出错为EOF

      feof函数

      调用方式:feof(fp)

      功能:对于二进制文件读取时判断文件是否结束

      返回值:结束:-1,反之0

  (2)数据块输入输出函数:fread与fwrite

    一般调用形式:

      fread(buffer,size,count,fp);

      fread(buffer,size,count,fp);

    参数说明:

      buffer:要读入的数据块的存放首地址或要输出的数据块的起始地址

      size:每个要读/写的数据块的个数

      count:要读/写的数据块的个数

      fp:要读/写的文件指针

    返回值:成功,返count值,出错或文件尾,0值

    fread与fwrite一般用于二进制文件的输入输出

  (3)按指定格式读写文件的函数:fprintf和fscanf

      一般调用格式:fscanf(fp,格式字符串,输入列表);

             fprintf(fp,格式字符串,输入列表);

      返回值:成功,返回I/O的个数,出错或文件尾,返回EOF

      由于输入输出时要进行ASCII码和二进制形式的转换,费时较多

1 fscanf(fp,"%d,%f",&i,&t");
2     /*若文件中有,3,4.5,则将3读出送入i,4.5读出送入t*/
3 fprintf(fp,"%d,%6.2f",i,t);
4     /*将i和t按%d,%6.2f格式写入到fp文件*/

  (4)其他读写函数

    1、putw和getw函数

    作用:以二进制形式,对磁盘文件读写一个int型的整数,4个字节

    返回值:成功:所写的整数值,失败:EOF

      eg:putw(10,fp);

        i=getw(fp);

    2、fgets和fputs函数(逐行读出、写入)

      形式:fgets(str,n,fp);(str字符数组,n-1个字符)

         fputs(字符串,fp);(“”不输出)

      作用:从fp指向的文件读/写一个字符串

      返回值:

        fgets正常时返回字符串的首地址,出错或文件尾,NULL     

        fputs正常时返回写入的最后一个字符;出错为EOF

五、文件的定位

  几个概念:

    文件位置指针---指向当前读写位置的指针,具体位置由文件打开方式确定

      “r”、"w":指向文件头

      “a”:指向文件尾

    读写方式:

      顺序读写:位置指针按字节位置顺序移动

      随机读写:位置指针按需要移动到任意位置

  (1)rewind函数:

    函数原型:void rewind(FILE *fp)

    功能:重置文件位置指针到文件开头

    返回值:无

  (2)fseek函数和随机读写

    调用形式:fseek(文件类型指针,位移量,起始点)

      位移量:>0向后移,<0向前移

      起始点:文件开始:SEEK_SET  0

          文件当前位置 SEEK_CUR  1

          文件末尾 SEEK_END   2

    功能:改变文件位置指针的位置

    返回值:成功,返回值,失败,返回非0值

  (3)ftell函数

    函数原型:long ftell(FILE *fp)

    功能:得到流式文件中位置指针当前位置(用相对于文件开头的位移量表示)

    返回值:返回当前位置指针位置,失败,返回-1L  

原文地址:https://www.cnblogs.com/Long-w/p/8650909.html