当前位置:文档之家› C语言第10章 对文件的输入输出

C语言第10章 对文件的输入输出


以上六种方式是针对“文本文件”类型
表10-2二进制文件的符号及其含义
文件使用方式 rb wb ab rb+ wb+ ab+ 代表的含义 打开一个已存在的二进制文件,只允许读数据 打开或建立一个二进制文件,只允许写数据 打开一个二进制文件,并在文件末尾追加数据 打开一个二进制文件,允许读和写 打开或建立一个二进制文件,允许读和写 打开一个二进制文件,允许打开3个标准文件: stdin:终端输入
stdout:终端输出
stderr:标准出错输出
5
表10-1文本文件的符号及其含义
文件使用方式 r w at rt+ at+ wt+ 代表的含义 打开一个已有的文本文件,只允许读取数据 打开或建立一个文本文件,只允许写入数据 打开一个已有的文本文件,并在文件末尾写数据 打开一个已有的文本文件,允许读和写 打开一个已有的文本文件,允许读或在文件末追加数据 打开或建立一个文本文件,允许读写
fgetc函数用来从指定的文件读入一个字符,该文件必须是读或写方 式打开的。fgetc函数的调用格式如下: ch=fgetc(fp); 其中fp为文件类型指针,ch为字符变量。fgetc函数返回的字符赋给 字符变量ch。如果在执行fgetc函数读字符时遇到文件结束符,则该函 数返回一个结束标志EOF(-1)。如果想从磁盘文件顺序读入字符并在屏 幕上显示出来,可以用以下的程序段: ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); }
说明:在书写时,要严格按照格式书写, 例如:将路径写成“C:\STUDENT\ch01_01\ch01_01.c” 是不正确的,这一点要特别注意。路径写成 “C:\\STUDENT\\ch01_01\\ch01_01.c”才是正确的,这 里的“\\”的含义是:第一个“\”代表转义字符,第二个 “\”才是字符本身。
apend
text binary
追加数据
文本文件,可省略 不写 二进制文件 可读可写
对上表做以下补充说明:
1. 程序中凡是用“r”打开一个文件时,表明该文件必须已经存在,且只 能从该文件读出数据。 2.用“w”打开的文件也只能向该文件写入数据。若打开的文件不存在, 则按照指定的文件名建立该文件,若打开的文件已经存在,则将该文件删 除,重建一个新文件。使用时要特别注意这一点。 3. 如果要向一个已经存在的文件后面追加新的信息,那只能用“a”方式 打开文件。但此时该文件必须是存在的,否则将会出错。
10.2.2文件的关闭
文件一旦使用完毕,应使用关闭文件函数 fclose把文件关闭,以避免 文件数据丢失等情况的发生。 fclose函数调用的一般形式为: fclose(FILE *fp); 其中,参数 fp 是文件型指针,通过 fopen() 函数已经获得,它指向某 个打开的文件。例如: fclose(fp); 上述语句的含义是关闭fp所指向的文件,同时自动释放分配给文件 的内存缓冲区。当正常完成关闭文件的操作时,fclose函数的返回值为 0,表示已正确关闭指定的文件;如返回非0值则表示有错误发生。
4.在打开一个文件之前,应该定义文件型指针,以便接收函数fopen返回的地址。 如果出错, fopen将返回一个空指针 NULL 。在程序中可以用这一信息来判别是否 完成打开文件的工作,并做相应的处理。 例如: if((fp=fopen(“file1”,”rb”))= =NULL) { printf(“\n error on open file1”); getch( ); exit(1); } 该程序段表示:如果返回的指针为空,则不能打开当前目录下的文件“file1”, 同时给出错误提示信息“error on open file1”。程序中的getch()函数的功能是从 键盘输入一个字符,该字符不在屏幕上显示。其实 getch() 在这里的作用是停留等 待,只有当用户从键盘敲任意键时,程序才继续执行,我们可以利用这个等待时间 来阅读出错提示,找到错误原因。当敲任意键后,执行语句“exit(1);”,从而退出 程序。
0010 0111 0001 0000
2015/9/8
00110001 00110000 00110000 00110000 00110000 0010 0111 0001 0000
1
第10章 文件
缓冲区文件系统:系统自动地在内存区为每一个正在使用的文件 开辟一个缓冲区。 程序数据区 输出文件缓冲区 输出 磁盘
可以看出,上面两个表的作用基本上是相同的,唯一的区别是 表10-2增加了一个表示二进制的字符“b”。其中,文件使用方式由r、 w、a、t、b和+六个字符组成,各字符的含义如表所示。
表10-3 文件使用方式中的字符及其含义
字母 r w 代表 read write 含义 读取数据 写入数据
a
t b +
#include <stdlib.h> #include <stdio.h> 例 10-1 int main() {FILE *fp; char ch,filename[10]; printf("请输入所用的文件名:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) // 打开输出文件并使fp指向此文件 { printf("无法打开此文件\n"); // 如果打开时出错,就输出"打不开"的信息 exit(0); // 终止程序*/ } ch=getchar( ); // 此语句用来接收在执行scanf语句时最后输入的回车符 printf("请输入一个准备存储到磁盘的字符串(以#结束):"); ch=getchar( ); // 接收从键盘输入的第一个字符 while(ch!='#') // 当输入'#'时结束循环 { fputc(ch,fp); // 向磁盘文件输出一个字符 putchar(ch); // 将输出的字符显示在屏幕上 ch=getchar(); // 再接收从键盘输入的一个字符 } fclose(fp); putchar(10); return 0; }
文件的打开与关闭
文件的打开(fopen 函数) FILE * fp; fp= fopen (文件名, 使用文件方式);
例如: fp=fopen ( "a1", "r");
文件名:参数为字符指针类型,实参为带路径的字符串。 使用文件方式:参见表10.1。 "r"、"w"、"a"、 "r+"、"w+"、"a+" "rb"、"wb"、"ab"、 …… 说明: "r"、"w"、"a"等打开文件的方式。 打开文件的常规方式: if ( ( fp=fopen ("file1","r"))==NULL) { printf("Cannot open this file \n"); exit(0); } 文件中的回车换行符内存中的换行符。
} FILE;
2015/9/8
level flags fd hold bsize buffer curp istemp token
……
……
3
10.2 文件的打开与关闭
由于文件的打开与关闭都是利用系统函数来实现的, 因此,在编写有关文件的程序时,应该在其中包含 “stdio.h”头文件。
10.2.1文件的打开
10.3
文件的读写
文件的读写操作由文件读写函数完成,常用的读写函数 有fputc、fgetc、fread、fwrite、fputs、fgets、fprintf、fscanf、 putw、getw等。
10.3.1 字符读写函数
读字符函数——fgetc函数 写字符函数——fputc函数
读字符函数——fgetc函数
输出
输入文件缓冲区
输入 输入
非缓冲区文件系统:系统不自动开辟确定大小的缓冲区,而由程 序为每个文件设定缓冲区。
2015/9/8
2
文件类型指针 typedef struct
{ short level; // 缓冲区“满”或“空”的程度
unsigned flags; // 文件状态标志 char fd; // 文件描述符 unsigned char hold; // 如无缓冲区不读取字符 short bsize; // 缓冲区的大小 unsigned char * buffer; // 数据缓冲区的位置 unsigned char *curp; // 指针,当前的指向 unsigned istemp; // 临时文件,指示器 short token; // 用于有效性检查
文件打开函数 fopen 用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中:“文件指针名”必须是被说明为FILE类型的指针变量; “文件名”是被打开文件的文件名;文件名通常是文件变量或文件 数组;“使用文件方式”是指文件的类型和操作要求。文件的使用 方式共有12种,表10.1给出了文本文件的符号和意义。
// 关闭文件 // 向屏幕输出一个换行符,换行符的ASCII代码为10
#include <stdio.h> #include <stdlib.h> 例 10-2 int main( ) {FILE *in,*out; char ch,infile[10],outfile[10]; // 定义两个字符数组,分别存放两个文件名 printf("输入读入文件的名字:"); scanf("%s",infile); // 输入一个输入文件的名字 printf("输入输出文件的名字:"); scanf("%s",outfile); // 输入一个输出文件的名字 if((in=fopen(infile,"r"))==NULL) // 打开输入文件 {printf("无法打开此文件\n"); exit(0); } if((out=fopen(outfile,"w"))==NULL) // 打开输出文件 {printf("无法打开此文件\n"); exit(0); } while(!feof(in)) // 如果未遇到输入文件的结束标志 {ch=fgetc(in); // 从输入文件读入一个字符,暂放在变量ch中 fputc(ch,out); // 将ch写到输出文件中 putchar(ch); // 将ch显示在屏幕上 } putchar(10); // 显示完全部字符后换行 fclose(in); // 关闭输入文件 fclose(out); // 关闭输出文件 return 0; }
相关主题