C 语言 —— 文件 I/O 函数

fopen() 函数

// fopen() 函数原型,位于 <stdio.h> 头文件中
FILE* fopen(const char *filename, const char *mode);

参数:第1个参数是保存文件名的字符串,第2个参数是打开文件的模式。
功能:以指定的 mode 模式打开名为 filename 的文件,返回一个指向 FILE 结构的指针。
返回:指向指定文件的 FILE 对象的指针。

通常,使用标准 I/O 的第1步就是调用 fopen() 打开文件。fopen() 函数不仅打开一个文件,还创建了一
个缓冲区(在读写模式下会创建两个缓冲区)以及一个包含文件和缓冲区数据的结构 FILE。另外,fopen() 返回一个指向该结构的指针,以便其他函数知道如何找到该结构。假设把该指针赋给一个指针变量 fp,我们说 fopen() 函数“打开一个流”。如果以文本模式打开该文件,就获得一个文本流;如果以二进制模式打开该文件,就获得一个二进制流。

文件打开模式

r,即 read,表示读模式。以 r 模式打开文件时,如果文件不存在则报错。
w,即 write,表示写模式。以 w 模式打开文件时,如果文件不存在则新建文件;如果文件存在则将原有内容擦除,重新写入。
a,即 append,表示写模式。以 a 模式打开文件时,如果文件不存在则新建文件;如果文件存在则从文件末尾开始添加内容。
+,表示读写模式。例如,r+ 表示读写模式打开文件,如果文件不存在则报错。w+ 表示读写模式打开文件,如果文件不存在则新建文件,如果文件存在则将原有内容擦除,重新写入。
b,即 binary,表示二进制模式。

FILE 结构

这个结构通常包含一个指定流中当前位置的文件位置指示器。除此之外,它还包含错误和文件结尾的指示器、一个指向缓冲区开始处的指针、一个文件标识符和一个计数。

struct _iobuf {
    char *_ptr; //文件输入的下一个位置
    int _cnt; //当前缓冲区的相对位置
    char *_base; //指基础位置(即是文件的其始位置)
    int _flag; //文件标志
    int _file; //文件的有效性验证
    int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
    int _bufsiz;
    char *_tmpfname; //临时文件名
};

getc() 和 putc() 函数

// getc() 和 putc() 函数原型,位于 <stdio.h> 头文件中
int getc(FILE *filename);
int putc(int char, FILE *filename);

getc() 参数:FILE 指针。
getc() 功能:向指定文件中获取一个字符。
getc() 返回:字符。

putc() 参数:第1个参数是需要输入的字符,第2个参数是指向需要输入字符的文件的指针。
putc() 功能:向指定文件中输入一个字符。
putc() 返回:如果发生错误返回 EOF。

fprintf() 和 fscanf() 函数

// fprintf() 和 fscanf() 函数原型,位于 <stdio.h> 头文件中
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...)

fprintf() 和 fscanf() 的工作方式与 printf() 和 scanf() 类似。但是,与 putc() 不同的是,fprintf() 和 fscanf() 函数都把 FILE 指针作为第1个参数,而不是最后一个参数。
fprintf() 返回:如果成功,则返回写入的字符总数,否则返回一个负数。
fscanf() 返回:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

fgets() 和 fputs() 函数

// <stdio.h>
char *fgets(char *str, int n, FILE *stream);
int fputs(const char *str, FILE *stream);

fgets() 参数:第1个参数和 gets() 函数一样,也是表示储存输入位置的地址(char * 类型);第2个参数是一个整数,表示待输入字符串的大小;最后一个参数是文件指针,指定待读取的文件。
fgets() 函数:从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。然后 fgets() 会在末尾添加一个空字符使其成为字符串。如果 fgets() 在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。
fgets() 返回:如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

fputs() 参数:第1个参数是字符串的地址;第2个参数是文件指针。
fputs() 函数:把字符串写入到指定的流 stream 中,但不包括空字符。和 puts() 函数不同,fputs() 在打印字符串时不会在其末尾添加换行符。
fputs() 返回:该函数返回一个非负值,如果发生错误则返回 EOF。

由于 fgets() 保留了换行符,fputs() 就不会再添加换行符,它们配合得非常好。

rewind() 函数

// <stdio.h>
void rewind(FILE *stream);

rewind 是倒回的意思。
功能:回到文件开头位置开始读取或写入。

fseek() 和 ftell() 函数

通过前面的 I/O 函数,我们可以打开一个文件,对文件进行读写一个字符、一个字符串、一行数据,可以回到文件开始的位置。接下来的 fseek() 和 ftell() 函数可以让我们移动到文件的任意位置,而不只是回到文件开头。

fseek()

// <stdio.h>
int fseek(FILE *stream, long int offset, int whence);

参数第1个参数是指向待查找的文件,fopen() 应该已打开该文件。第2个参数是偏移量(offset),该参数表示从起始点开始要移动的距离,该参数必须是一个 long 类型的值,可以为正(前移)、负(后移)或 0(保持不动)。第3个参数是模式,该参数确定起始点。根据 ANSI 标准,在 <stdio.h> 头文件中规定了几个表示模式的明示常量(#define 定义的变量) —— SEEK_SET(0)、SEEK_CUR(1)、SEEK_END(2) ,这三个明示变量分别表示文件开始处、当前位置、文件末尾。
功能:可把文件看作是数组,在 fopen() 打开的文件中直接移动到指定的字节处。
返回:如果一切正常,fseek() 的返回值为 0;如果出现错误(如试图移动的距离超出文件的范围),其返回值为 -1。

fseek(fp, 0L, SEEK_SET); // 定位至文件开始处 
fseek(fp, 10L, SEEK_SET); // 定位至文件中的第10个字节 
fseek(fp, 2L, SEEK_CUR); // 从文件当前位置前移2个字节 
fseek(fp, 0L, SEEK_END); // 定位至文件结尾 
fseek(fp, -10L, SEEK_END); // 从文件结尾处回退10个字节 

ftell()

// <stdio.h>
long int ftell(FILE *stream);

参数:FILE 指针。
功能:返回当前位置。在最初实现的 UNIX 中,ftell() 通过返回距文件开始处的字节数来确定文件的位置。文件的第1个字节到文件开始处的距离是0,以此类推。ANSI C 规定,该定义适用于以二进制模式打开的文件,以文件模式打开文件的情况不同。
返回:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

ftell()- 函数在文本模式和二进制模式中的工作方式不同。许多系统的文本文件格式与 UNIX 的模型有很大不同,导致从文件开始处统计的字节数成为一个毫无意义的值。ANSI C 规定,对于文本模式,ftell() 返回的值可以作为 fseek() 的第2个参数。对于 MS-DOS,ftell() 返回的值把 \r\n 当作一个字节计数。

fgetpos() 和 fsetpos() 函数

fseek() 和 ftell() 函数智能处理文件大小在 long 类型能表示的范围内。也许20亿字节看起来相当大,但是随着存储设备的容量迅猛增长,文件也越来越大。鉴于此,ANSI C 新增了两个处理较大文件的新定位函数:fgetpos() 和 fsetpos()。
这两个函数不使用 long 类型的值表示位置,它们使用一种新类型:fpos_t(代表 file position type,文件定位类型)。fpos_t 类型不是基本类型,它根据其他类型来定义。fpos_t 类型的变量或数据对象可以在文件中指定一个位置,它不能是数组类型,除此之外,没有其他限制。

int fgetpos(FILE * restrict stream, fpos_t * restrict pos); 

ANSI C 定义了如何使用 fpos_t 类型。调用该函数时,它把 fpos_t 类型的值放在 pos 指向的位置上,该值描述了文件中的一个位置。
fgetpos() 返回:如果成功,fgetpos() 函数返回0;如果失败,返回非0。

int fsetpos(FILE *stream, const fpos_t *pos); 

调用该函数时,使用 pos 指向位置上的 fpos_t 类型值来设置文件指针指向该值指定的位置。
fsetpos() 返回:如果成功,fsetpos()函数返回0;如果失败,则返回非0。
PS:fpos_t 类型的值应通过之前调用 fgetpos() 获得。

fclose() 函数

// fclose() 函数原型,位于 <stdio.h> 头文件中
int fclose(FILE *filename);

功能:关闭 filename 指向的文件。c
返回:如果关闭成功,则该方法返回 0。如果失败,则返回 EOF。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值