C语言--之6--输入与输出--4.文件访问

编写一个访问文件的程序,且它所访问的文件还没有连接到该程序。

step1 打开文件(fopen)

在读写一个文件之前,必须通过库函数 fopen 打开该文件。fopen 用类似于 x.c 或 y.c 这样的外部名与操作系统进行某些必要的连接和通信(不必关心这些细节),并返回一个随后可以用于文件读写操作的指针。该指针称为文件指针,它指向一个包含文件信息的结构,这些信息包括:缓冲区的位置、缓冲区中当前字符的位置、文件的读或写状态、是否出错或是否已经到达文件结尾等等

<stdio.h> 中已经定义了一个包含这些信息的结构 FILE。在程序中只需按照下列方式声明一个文件指针即可:

FILE *fp;
FILE *fopen(char *name, char *mode);

fopen 函数返回一个指向结构 FILE 的指针

FILE 像 int 一样是一个类型名,而不是结构标记。它是通过 typedef 定义的:

  • fopen 的第一个参数是一个字符串,它包含文件名
  • 第二个参数是访问模式,也是一个字符串,用于指定文件的使用方式。允许的模式包括:读(“r”)、写(“w”)及追加(“a”)。某些系统还区分文本文件和二进制文件,对后者的访问需要在模式字符串中增加字符“b”。
  • 如果打开一个不存在的文件用于写或追加,该文件将被创建(如果可能的话)。
  • 当以写方式打开一个已存在的文件时,该文件原来的内容将被覆盖。但是,如果以追加方式打开一个文件,则该文件原来的内容将保留不变。
  • 读一个不存在的文件会导致错误,其它一些操作也可能导致错误,比如试图读取一个无读取权限的文件。
  • 如果发生错误,fopen 将返回 NULL。

step2 对文件进行读写

2.1 getc 和 putc

getc 从文件中返回下一个字符,它需要知道文件指针,以确定对哪个文件执行操作:

int getc(FILE *fp)

getc 函数返回 fp 指向的输入流中的下一个字符。如果到达文件尾或出现错误,该函数将返回 EOF。

putc 是一个输出函数,如下所示:

int putc(int c, FILE *fp)

该函数将字符 c 写入到 fp 指向的文件中,并返回写入的字符。如果发生错误,则返回 EOF。

类似于 getchar 和 putchar,getc 和 putc 是宏而不是函数。

启动一个 C 语言程序时,操作系统环境负责打开 3 个文件,并将这 3 个文件的指针提供给该程序:

  • 这 3 个文件分别是标准输入、标准输出和标准错误,相应的文件指针分别为 stdin、stdout 和 stderr,它们在<stdio.h>中声明。
  • 在大多数环境中,stdin 指向键盘,而stdout 和 stderr 指向显示器。
  • stdin 和 stdout 可以被重定向到文件或管道。
  • 文件指针 stdin 与 stdout 都是 FILE *类型的对象。但它们是常量,而非变量。 因此不能对它们赋值。

2.2 getchar 和 putchar

getcharputchar 函数可以通过 getc、putc、stdin 及 stdout 定义如下:

#define getchar() getc(stdin)
#define putchar(c) putc((c), stdout)

2.3 fscanf 和 fprintf

对于文件的格式化输入或输出,可以使用函数 fscanffprintf。它们与 scanf 和 printf 函数的区别仅仅在于它们的第一个参数是一个指向所要读写的文件的指针,第二个参数是格式串。如下所示:

int fscanf(FILE *fp, char *format, ...)
int fprintf(FILE *fp, char *format, ...)

step3 关闭文件(fclose)

int fclose(FILE *fp)

该函数执行和 fopen 相反的操作,它断开由 fopen 函数建立的文件指针和外部名之间的连接,并释放文件指针以供其它文件使用:

  • 因为大多数操作系统都限制了一个程序可以同时打开的文件数,所以,当文件指针不再需要时就应该释放,这是一个好的编程习惯。
  • 对输出文件执行 fclose 还有另外一个原因:它将把缓冲区中由 putc 函数正在收集的输出写到文件中。
  • 当程序正常终止时,程序会自动为每个打开的文件调用fclose 函数。(如果不需要使用 stdin 与 stdout,可以把它们关闭掉。也可以通过库函数freopen 重新指定它们。)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值