得程序设设 20023
C语言程序设计 2002 年 第九章 输入输出
第九章输入输出 为永久性保存数据,需将数据以数据文件的形式存放, 以及从现有的某数据文件中读取数据,形成对数据文件的 输入输出。 C程序的输入输出有两种方式 (1)标准O或流式IO:依靠标准库函数实现输入输出。 如 printf(“s” (2)低级O:利用操作系统提供的接口函数(称为底层 接口或系统调用)实现输入输出
第九章 输入输出 为永久性保存数据,需将数据以数据文件的形式存放, 以及从现有的某数据文件中读取数据,形成对数据文件的 输入输出。 C程序的输入输出有两种方式: (1)标准I/O或流式I/O:依靠标准库函数实现输入输出。 如printf(“sss”) (2)低级I/O:利用操作系统提供的接口函数(称为底层 接口或系统调用)实现输入输出
91流式 流式IO中,文件被看成是字符(字节)的序列(即 流”) C环境中,将所有ⅣO设备当成文件进行管理,显示器 为输出文件,用以输出数据,键盘为输入文件,用以输入 数据。 流式JO通过FE指针(FIE结构类型在中 定义)存取文件 流式文件分为两种: (1)文本文件:字符流序列;如32767需要5个 字节存储; (2)二进制文件:字节流序列;如32767需要2个 字节存储;但显示时,需进行转换
9.1 流式I/O 流式I/O中,文件被看成是字符(字节)的序列(即 “流”), C环境中,将所有I/O设备当成文件进行管理,显示器 为输出文件,用以输出数据,键盘为输入文件,用以输入 数据。 流式I/O通过FILE指针(FILE结构类型在中 定义)存取文件 流式文件分为两种: (1)文本文件: 字符流序列;如32767需要5个 字节存储; (2)二进制文件:字节流序列;如32767需要2个 字节存储;但显示时,需进行转换
缓冲 区空 输入缓冲区 输入文件 程序 数据区 输出缓冲区 输出文件 缓冲 区满 文件I/O缓冲机制
输入缓冲区 输出缓冲区 输入文件 输出文件 程序 数据区 文件I/O缓冲机制 缓冲 区空 缓冲 区满
92标准输入输函数 921文件的打开与关闭 文件的处理步骤为: (1)首先打开文件,建立FILE指针和物理文件的联 系,系统分配缓冲资源; (2)利用标准输入输出函数读写文件,进行相关处理; (3)关闭文件,将输出缓冲区中未写到文件中的数据输 出到文件中(称为缓冲区清仓),系统释放缓冲资源。 C程序开始执行时,自动打开三个标准流式文件: (1)标准输入文件( stdin),对应键盘; (2)标准输出文件( stdout),对应显示器; (3)标准错误输出文件( stderr),对应显示器
9.2 标准输入输出函数 9.2.1 文件的打开与关闭 文件的处理步骤为: (1)首先打开文件,建立FILE指针和物理文件的联 系,系统分配缓冲资源; (2)利用标准输入输出函数读写文件,进行相关处理; (3)关闭文件,将输出缓冲区中未写到文件中的数据输 出到文件中(称为缓冲区清仓),系统释放缓冲资源。 C程序开始执行时,自动打开三个标准流式文件: (1)标准输入文件(stdin),对应键盘; (2)标准输出文件(stdout),对应显示器; (3)标准错误输出文件(stderr) ,对应显示器
用于打开与关闭文件的函数 (1) fopen打开文件 函数原型:FILE*open( char filename,char*mode) 其中: filename:字符串形式的文件名 mode:文件存取方式,为r,w,a,b,+的组合字符串 “r”,r+”b”,”r+b”读 W+”,wb2,w+b”写 “a,a+”2ab;a+b添加 r:表示读文件,此时该文件必须存在; w:表示写;该文件必须存在时,清空文件数据,不存在 时,创建指定文件名的文件。 a:表示在文件尾添加数据,不清空文件数据
用于打开与关闭文件的函数 (1)fopen 打开文件 函数原型:FILE *fopen(char *filename, char *mode) 其中: filename:字符串形式的文件名 mode:文件存取方式,为r,w,a,b,+的组合字符串 “r”,”r+”,”rb”,”r+b” 读 “w”,”w+”,”wb”,”w+b” 写 “a”,”a+”,”ab”,”a+b” 添加 r:表示读文件,此时该文件必须存在; w:表示写;该文件必须存在时,清空文件数据,不存在 时,创建指定文件名的文件。 a:表示在文件尾添加数据,不清空文件数据
+:表示文件既可以读,也可以写 b:表示打开的文件为二进制文件。缺省时表示文本文件。 r+则表示对一个存在的文本文件进行读写方式打开; r+则表示对不一定存在的文本文件进行读写方式打开,并且 清空文件数据; 例: FILE *fp; fp= fopen(“ student. dat”,”r”); if(fp=NULL){ printi不能打开文件 student. dat”); exit(-1)
+:表示文件既可以读,也可以写; b: 表示打开的文件为二进制文件。缺省时表示文本文件。 r+则表示对一个存在的文本文件进行读写方式打开; r+则表示对不一定存在的文本文件进行读写方式打开,并且 清空文件数据; 例: FILE *fp; fp=fopen(“student.dat”,”r”); if (fp==NULL) { printf(“不能打开文件”, “student.dat”); exit(-1); } fp=fopen(“C:\\LI\\student.dat”,”r”);
(2) fclose关闭文件 函数原型: int fclose(FILE* stream); 返回值:正确时返回0,错误时返回EOF。 strean:FIE指针。 例 fclose(fp) 注:如果对打开的文件未执行过 fclose,则程序终止时将自动 调用 fclose关闭所有未关闭的文件
(2)fclose 关闭文件 函数原型:int fclose(FILE *stream); 返回值: 正确时返回0,错误时返回EOF。 stream: FILE指针。 例: fclose (fp); 注:如果对打开的文件未执行过fclose,则程序终止时将自动 调用fclose关闭所有未关闭的文件
922文件的读写操作 字符读写函数 (1) fgetc:从文件中读取一个字符( unsigned char)并转 换成int值返回。 (2) fputc:将参数c转换为 unsigned char写到文件中。 (3)getc和putc:分别等同于getc和 fputc getchar与 putchar是建立在getc和putc上的宏 #define getchar getc(stdin) #define putchar(x) putc((x), stdout) (4) ungetc:将 getchar、 fgetc、getc读入的字符回送。 例:c= getchar;/输入a ungetc(c);cl= getchar(0;/c1的值为‘a,*
9.2.2 文件的读写操作 一、字符读写函数 (1)fgetc: 从文件中读取一个字符(unsigned char)并转 换成int值返回。 (2)fputc: 将参数c转换为unsigned char写到文件中。 (3)getc和putc:分别等同于fgetc 和fputc。 getchar与putchar是建立在getc和putc上的宏: #define getchar() getc(stdin) #define putchar(x) putc((x),stdout) (4)ungetc:将getchar、fgetc、 getc读入的字符回送。 例:c=getchar(); /*输入a*/ ungetc( c ); c1=getchar(); /*c1的值为‘a’*/
(5) ferror(frp):错误测试。 测试JO操作是否有错,返回0表示正常,非0表示IO操作 出错。 5)feof(p):文件结尾测试。 若读写指针指向文件尾,返回非0,否则。返回0。 般用于测试输入文件的读过程。 feof(fp)&&!ferror(fp)(, feof(fp==0 & ferror(fp)==0 表示指针未指向文件尾,且文件操作正常
(5)ferror(fp):错误测试。 测试I/O操作是否有错,返回0表示正常,非0表示I/O操作 出错。 (5)feof(fp):文件结尾测试。 若读写指针指向文件尾,返回非0,否则。返回0。 一般用于测试输入文件的读过程。 !feof(fp) && !ferror(fp) ➔ feof(fp)==0 && ferror(fp)==0 表示指针未指向文件尾,且文件操作正常