C Primer Plus (第五版)中文版——第 13 章 文件输入/输出

13.1  和文件进行通信

13.1.1  文件是什么

一个文件(file)通常就是磁盘上的一段命名的存储区。C 将文件看成是连续的字节序列,其中没一个字节单独地读取。ANSI C 提供了文件的两种视图:文本视图、二进制视图。

13.1.2  文本视图和二进制视图

在二进制视图中,文件的每个字节都可以为程序所访问。在文本视图中,程序看到的内容和文件的内容有可能不同。

MS-DOS区分文本文件和二进制文件,C 提供的是文本和二进制视图。通常,对于文本文件使用文本视图,对于二进制文件使用二进制视图。

13.1.3  I/O 级别

I/O 级别即处理文件存取的级别。分为:

  • 低级 I/O:使用操作系统提供的基本 I/O 服务。
  • 标准高级 I/O:使用一个标准的 C 库函数包和 stdio.h 头文件中的定义。

ANSI C 只支持标准 I/O 包。

13.1.4  标准文件

C 程序为您自动打开3个文件:

  • 标准输入:默认是系统的一般输入设备,通常为键盘。标准输入是常用的程序输入对象,为 getchar()、gets()、scanf() 所使用。
  • 标准输出:默认是系统的一般输出设备,通常为显示器。标准输出是常用的程序输出对象,为 putchar()、puts()、printf() 所使用。
  • 标准错误输出:默认是系统的一般输出设备,通常为显示器。标准错误输出提供一个可供发送错误信息的逻辑上不同的位置。

说明:

  • 如果使用重定向方法将输出发送到一个文件中而不是屏幕上,发送到标准错误输出的输出内容仍然会被发送到屏幕上。

13.2  标准 I/O

除了可移植性之外,标准 I/O 包相对于低级 I/O 有两点优势:

  • 标准 I/O 包中包含很多专用的函数,可以方便地处理不同的 I/O 问题。
  • 对输入和输出进行了缓冲。即大块地转移信息,而不是每次一个字节进行转移,这种缓冲大大提高了数据传输率。

13.2.1  检查命令行参数

程序检查 argc 的值,查看是否有命令行参数。如果没有,程序打印一条用法提示后退出。

if(argc != 2)
{
        printf("Useage:%s filename",argv[0]);
        exit(EXIT_FAILURE);
}

13.2.2  fopen() 函数

fopen() 函数用于打开文件。该函数在 stdio.h 中声明,它接受两个参数:

  • 第一个参数是要打开的文件名,更确切地说,是包含该文件名的字符串的地址。
  • 第二个参数是用于指定文件打开模式的一个字符串。
fopen() 函数的模式字符串
模式字符串 意义
"r" 打开一个文本文件,可以读取文件。
"w" 打开一个文本文件,可以写入文件。如果该文件存在则先将文件的长度截为零;如果不存在则先创建之。
"a" 打开一个文本文件,可以写入文件。向已有文件的尾部追加内容,如果该文件不存在则先创建之。
"r+" 打开一个文本文件,可以进行更新。可以读取和写入文件。
"w+" 打开一个文本文件,可以进行更新。如果该文件存在则先将文件的长度截为零;如果不存在则先创建之。
"a+" 打开一个文本文件,可以进行更新。向已有文件的尾部追加内容,如果该文件不存在则先创建之。可以读取整个文件,但写入时只能追加内容。

"rb"、"wb"、"ab"、

"rb+"、"r+b"、

"wb+"、"w+b"、

"ab+"、"a+b"

与前面的模式相似,只是使用二进制模式而非文本模式打开文件

程序打开一个文件后,fopen() 函数返回一个文件指针(file pointer),其他 I/O 函数用这个指针来指定该文件。文件指针 fp 是一种指向 FILE 的指针;FILE 是 stdio.h 中定义的一种派生类型。

程序没能打开文件时,fopen() 函数返回空指针。如果 fp 为 NULL,程序将推出。

13.2.3  getc() 函数和 putc() 函数

使用 getc() 函数和 putc() 函数时,需要告诉它们要使用的文件。

  • 从指针 fp 指定的文件中获得一个字符:ch = getc(fp);
  • 将字符 ch 写入到 FILE 指针 fpout 指定的文件中:putc(ch,fpout);

13.2.4  文件结尾

如果在尝试读取字符时发现已经达到文件结尾,getc() 函数会返回一个特殊值 EOF。为了避免读取空文件带来的问题,应对文件输入使用入口条件循环,且在进入循环体之前尝试进行第一次读取。

//设计范例
int ch;                //int来控制EOF

FILE *fp;
fp = fopen("wacky.xt","r");
ch = getc(fp);        //获取初始输入
while(ch!=EOF)
{
        putchar(ch);    //处理输入
        ch=getc(fp);    //获取下一个输入  
}

13.2.5  fclose() 函数

fclose(fp) 关闭指针 fp 指定的文件,同时根据需要刷新缓冲区。如果文件成功关闭,fclose() 函数将返回值0,否则返回 EOF。

13.2.6  标准文件指针

标准文件 文件指针 一般使用的设备
标准输入 stdin 键盘
标准输出 stdout 显示器
标准错误输出 stderr 显示器

猜你喜欢

转载自blog.csdn.net/Mr__Gold/article/details/85161079
今日推荐