当前位置:嗨网首页>书籍在线阅读

07-标准IO

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

13.2 标准I/O

与底层I/O相比,标准I/O包除了可移植以外还有两个好处。第一,标准I/O有许多专门的函数简化了处理不同I/O的问题。例如, printf() 把不同形式的数据转换成与终端相适应的字符串输出。第二,输入和输出都是缓冲的。也就是说,一次转移一大块信息而不是一字节信息(通常至少512字节)。例如,当程序读取文件时,一块数据被拷贝到缓冲区(一块中介存储区域)。这种缓冲极大地提高了数据传输速率。程序可以检查缓冲区中的字节。缓冲在后台处理,所以让人有逐字符访问的错觉(如果使用底层I/O,要自己完成大部分工作)。程序清单13.1演示了如何用标准I/O读取文件和统计文件中的字符数。我们将在后面几节讨论程序清单13.1中的一些特性。该程序使用命令行参数,如果你是Windows用户,在编译后必须在命令提示窗口运行该程序;如果你是Macintosh用户,最简单的方法是使用Terminal在命令行形式中编译并运行该程序。或者,如第11章所述,如果在IDE中运行该程序,可以使用Xcode的Product菜单提供命令行参数。或者也可以用 puts()fgets() 函数替换命令行参数来获得文件名。

程序清单13.1  count.c 程序

/* count.c -- 使用标准 I/O */
#include <stdio.h>
#include <stdlib.h>    // 提供 exit()的原型
int main(int argc, char *argv [])
{
     int ch;            // 读取文件时,存储每个字符的地方
     FILE *fp;        // “文件指针”
     unsigned long count = 0;
     if (argc != 2)
     {
          printf("Usage: %s filename\n", argv[0]);
          exit(EXIT_FAILURE);
     }
     if ((fp = fopen(argv[1], "r")) == NULL)
     {
          printf("Can't open %s\n", argv[1]);
          exit(EXIT_FAILURE);
     }
     while ((ch = getc(fp)) != EOF)
     {
          putc(ch, stdout);    // 与 putchar(ch); 相同
          count++;
     }
     fclose(fp);
     printf("File %s has %lu characters\n", argv[1], count);
     return 0;
}