zoukankan      html  css  js  c++  java
  • 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  

  • 相关阅读:
    【转载】S5PV210 三星官方原理图(包含核心板和底板)
    关于飞凌技术支持更改通知
    【收集】几个gooogleman嵌入式联盟比较好的帖子
    分析我的OV3640 打开软件立即导致PDA死机的原因
    【喜讯】嘿嘿,Real6410/TE6410/OK6410 支持jlink V8+RVDS2.2 仿真调试了
    【转载】三星A8 S5pV210 硬件设计指南S5PV210_Hardware Design Guide_Rev1.0
    【爆料】公布一个经典6410 原理图(orcad)+PCB(candence)图—— real6410 PCB 大全(核心板+底板)
    【呜呼】大学生烧毕业证书谁的错?!
    【转载】三星A8 S5pV210 硬件设计指南S5PV210_Hardware Design Guide_Rev1.0
    【转载】2440的GPIO模拟IIC程序
  • 原文地址:https://www.cnblogs.com/Long-w/p/8650909.html
Copyright © 2011-2022 走看看