C语言——文件操作

文件操作

数据的输入和输出基本伴随着整个C程序,输入就是从“源端”获取数据,输出就是向终端写入数据

文件的分类

计算机上的各种资源都是由操作系统管理和控制的,操作系统中的文件系统,是专门负责将外部存储设备中的信息组织方式进行统一管理规划,以便为程序访问数据提供统一的方式。
文件是操作系统管理数据的基本单位,文件一般是指存储在外部存储介质上的有名字的一系列相关数据的有序集合。它是程序对数据进行读写操作的基本对象。在 C 语言中,把输入和输出设备都看作文件
  1. 文件一般包括三要素 :文件路径、文件名、文件后缀;

  2. 文件路径:可以显式指出其绝对路径,如上面的”E:\”或者”E:/”等;如果没有显式指出其路径,默认为当前路径。
    C 语言不仅支持对当前目录和根目录文件的操作,也支持对多级目录文件的操作,例如:
    D:\C_WorkSpace\Chapter_10\file_1.txt
    或者
    D:/C_WorkSpace/Chapter_10/file_1.txt
    中的 file_1.txt 均是 C 语言可操作的多级目录文件。

  3. 文件名:标识文件名字的合法标识符,如 ch10、file_1 等都是合法的文件名。

  4. 后缀:一般用于标明文件的类型,使用方式为:文件名.后缀,即文件名与后缀之间用 ‘.’ 隔开。常见的 后缀类型有:doc、txt、dat、c、cpp、obj、exe、bmp、jpg 等。

  5. C 语言中的输入和输出都是和文件相关的,即程序从文件中输入(读取)数据,程序向文件中输出(写入)数据。
    文件按其逻辑结构可分为:记录文件和流式文件。而记录文件又可分为:顺序文件、索引文件、索引顺 序文件及散列文件等。
    流式文件是以字节为单位,对流式文件的访问一般采用穷举搜索的方式,效率不高,故一般需频繁访问的较大数据不适宜采用流式文件逻辑结构。但由于流式文件管理简单,用户可以较方便地对文件进行相关操作。

文件的打开和关闭

  1. 打开fopen函数:`FILE * fopen(char *filename, char *mode);

  2. mode:
    模式 含 义 说 明
    r 只读 文件必须存在,否则打开失败
    w 只写 若文件存在,则清除原文件内容后写入;否则,新建文件后写入
    a 追加只写 若文件存在,则位置指针移到文件末尾,在文件尾部追加写人,故该方式不 删除原文件数据;若文件不存在,则打开失败
    r+ 读写 文件必须存在。在只读 r 的基础上加 ‘+’ 表示增加可写的功能。下同
    w+ 读写 新建一个文件,先向该文件中写人数据,然后可从该文件中读取数据
    a+ 读写 在” a”模式的基础上,增加可读功能
    rb 二进制读 功能同模式”r”,区别:b表示以二进制模式打开。下同
    wb 二进制写 功能同模式“w”。二进制模式
    ab 二进制追加 功能同模式”a”。二进制模式
    rb+ 二进制读写 功能同模式"r+”。二进制模式
    wb+ 二进制读写 功能同模式”w+”。二进制模式
    ab+ 二进制读写 功能同模式”a+”。二进制模式

  3. 返回值:打开成功,返回该文件对应的 FILE 类型的指针;打开失败,返回 NULL。故需定义 FILE 类型的指针变量,保存该函数的返回值。可根据该函数的返回值判断文件打开是否成功

  4. 关闭fclose函数:int fclose(FILE *fp);返回值:正常关闭,返回否则返回 EOF(-1)

文件的顺序读写

对文件读取操作完成后,如果从文件中读取到的每个数据的顺序与文件中该数据的物理存放顺序保持一致,则称该读取过程为顺序读取;同理,对文件写入操作完成后,如果文件中所有数据的存放顺序与各个数据被写入的先后顺序保持一致,则称该写入过程为顺序写入

fgetc 函数说明:
作用:从文件指针指向的文件流中读取一个字符,读取一个字节后,光标位置后移一个字节
格式:int fgetc(FILE *stream);
返回值:返回所读取的一个字节,如果读到文件末尾或者读取出错时返回EOF(EOF是文件结束标识符,一般值为-1)
参数说明:
*stream:文件指针,从该文件指针指向的文件中读取一个字符,然后将光标后移一个字节

fputc 函数说明:
作用:将指定字符写到文件指针所指向的文件的当前写指针位置上
格式:int fputc (char c, File *fp);
返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF
参数说明:
c:需要写入的字符
*fp:文件指针,在当前文件指针所指向的文件的当前写指针位置上写入一个字符c,然后文件内部写指针会自动后移一个字节位置

fgets 函数说明:
作用:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋’\0’),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。
格式:char *fgets(char *buf, int bufsize, FILE *stream);
返回值:函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
参数说明:
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的大小。
*stream: 文件指针,将要读取的文件流。

fputs 函数说明:
作用:向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)
格式:int fputs(char *str, FILE *fp);
返回值:若成功返回0,失败返回EOF
参数说明:
*str: 需要写入的字符串
*fp: 文件指针,将要写入的文件流

fprintf 函数说明:
作用:格式化后输出到文件中
格式:int fprintf (FILE* stream, const char* format, [argument]);
返回值:若成功返回值是输出的字符数,当发生错误时返回一个负值
参数说明:
*stream:文件指针
*format:输出格式
[argument]:附加参数列表
注:用法与printf函数类似,这里只是参数多了一个文件指针,将格式后的结果输出到文件中

fscanf 函数说明:
作用:从一个流中执行格式化输入
格式:int fscanf(FILE* stream,constchar* format,[argument]);
返回值:成功返回读入的参数的个数,失败返回EOF。
参数说明:
*stream:文件指针
*format:格式字符串
[argument]:输入列表
注:用法与scanf函数类似

fread 函数说明:
作用:从一个文件流中读数据,最多读取count个元素,每个元素size字节
格式:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
返回值:如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回0
参数说明:
*buffer:用于接收数据的内存地址
size:要读的每个数据项的字节数,单位是字节
count:要读count个数据项,每个数据项size个字节
*stream:文件指针
注:这个函数以二进制形式对文件进行操作,不局限于文本文件

fwrite 函数说明:
作用:向文件写入一个数据块
格式:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
返回值:返回实际写入的数据块数目
参数说明:
*buffer:待写入的数据的内存地址
size:要写入内容的单字节数
count:要进行写入size字节的数据项的个数
*stream:文件指针
注:这个函数以二进制形式对文件进行操作,不局限于文本文件

  1. 在操作文件时,经常使用 feof 函数来判断是否到达文件结尾。
    feof 函数的函数原型为:
    int feof (FILE * fp);函数功能:
    检查 fp 所关联文件流中的结束标志是否被置位,如果该文件的结束标志已被置位,返回非 0 值;否则,返回 0
  2. 数据块读取(输入)函数 fread 的函数原型为:
    unsigned fread (void buf, unsigned size, unsigned count, FILE fp)
    函数功能:从 fp 指向的文件中读取 count 个数据块,每个数据块的大小为 size。把读取到的数据块存放到 buf 指针指向的内存空间中。
    返回值:返回实际读取的数据块(非字节)个数,如果该值比 count 小,则说明已读到文件尾或有错误产生。这时一般采用函数 feof 及 ferror 来辅助判断
  3. 函数 fseek 的函数原型为:
    int fseek(FI:LE *fp, long offset, int origin);
    函数功能:把文件读写指针调整到从 origin 基点开始偏移 offset 处,即把文件读写指针移动到 origin+offset 处

随机读写数据文件

rewind 函数说明:
作用:将文件内部的位置指针重新指向一个流(数据流/文件)的开头
格式:void rewind(FILE *stream);
返回值:无
参数说明:
*stream:文件指针

ftell 函数说明:
作用:得到文件位置指针当前位置相对于文件首的偏移字节数(测定文件位置标记的当前位置)
格式:long ftell(FILE *stream);
返回值:成功返回当前文件位置,失败返回-1L
参数说明:
*stream:文件指针
注:因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。

fseek 函数说明:
作用:重定位流(数据流/文件)上的文件内部位置指针
格式:int fseek(FILE *stream, long offset, int origin);
返回值:成功返回0,失败返回非0值
参数说明:
*stream:文件指针
offset:偏移量,正数表示正向偏移,负数表示负向偏移。因为是long型数据,所以应在数字后面加一个字母L
origin:设定从文件的哪里开始偏移,可取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET,详见下表:

文件读写的出错检测

ferror 函数说明:
作用:在调用各种输入输出函数(如 putc、getc、fread、fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查
格式:int ferror(FILE *stream);
返回值:返回0表示未出错,返回非0值表示出错
参数说明:
*stream:文件指针

clearerr 函数说明:
作用:使文件错误标志和文件结束标志置为0。假设在调用一个输入输出函数时出现了错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变为0。只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。
格式:void clearerr(FILE *stream);
返回值:无
参数说明:
*stream:文件指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值