15.5 流I/O总览
轻松地在C程序中执行于文件相关的I/O任务。下面关于文件I/O的一般概况。
1.程序为必须同时处于活动状态的每个文件声明一个指针变量,其类型为FILE*。这个指针指向FILE结构,当它处于活动状态时由流使用。
2.流通过调用fopen函数打开。为了打开一个流,必须指定需要访问的文件或设备以及它们的访问方式(例如,读、写或者既读又写)。Fopen向操作系统验证文件或设备确实存在(在有些操作系统中,还会验证是否允许执行所指定的访问方式)并初始化FILE结构。
3.根据需要对该文件进行读取或写入。
4.调用fclose函数关闭流。关闭一个流可以防止与它相关联的文件被再次访问,保证任何存储于缓冲区的数据被正确地写到文件中,并且释放FILE结构,以使它可以用于另外的文件。
标准流的I/O更为简单,因为它们并不需要打开或关闭。
I/O函数以3种基本的形式处理数据:单个字符、文本行或二进制数据。对于每种形式,都有一组特定的函数对它们进行处理。表15.1列出了用于每种I/O形式的函数或函数家族。它指向一组函数中的每个都执行相同的基本任务,只是方式稍有不同。这些函数的区别在于获得输入的来源或输出写入的地方不同。这些变体用于执行下面的任务。
执行字符、文本行和二进制I/O的函数
表15.1 函数名或函数家族名
数据类型 输入 输出 描述
字符 getchar putchar 读取(写入)单个字符
文本行 gets puts 文本行末格式化的输入(输出)
scanf printf 格式化的输入(输出)
二进制数据 fread fwrite 读取(写入)二进制数据
1.只用于stdin或stdout。
2.随作为参数的流使用。
3.使用内存中的字符串而不是流。
需要一个流参数的函数将接受stdin或stdout作为它的参数。有些函数家族并不具备用于字符串的函数变体,因为使用其他语句或函数来实现相同的效果更为容易。表15.2列出了每个家族的函数。
表15.2 输入/输出函数家族
家族名 目的 可用于所有的流 只用于stdin和stdout 内存中的字符串
getchar 字符输入 fgetc、getc getchar (1)
putchar 字符输出 fputc、putc putchar (1)
gets 文本行输入 fgets gets (2)
puts 文本行输出 fputs puts (2)
scanf 格式化输入 fscanf scanf sscanf
printf 格式化输出 fprintf printf sprintf
(1)对指针使用下标或间接访问操作从内存获得一个字符(或向内存写入一个字符)。
(2)使用strcpy函数从内存读取文本行(或向内存写入文本行)。