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 中声明,它接受两个参数:
- 第一个参数是要打开的文件名,更确切地说,是包含该文件名的字符串的地址。
- 第二个参数是用于指定文件打开模式的一个字符串。
模式字符串 | 意义 |
"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 | 显示器 |