C语言高级语言程序设计(一)-第六章 高级程序设计.ppt
《C语言高级语言程序设计(一)-第六章 高级程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言高级语言程序设计(一)-第六章 高级程序设计.ppt(56页珍藏版)》请在三一文库上搜索。
1、高级语言程序设计(一) (C Programming),第六讲:高级程序设计,本章目标,掌握文件结束判断方法; 掌握文件格式化输入/输出方法; 了解文件块输入/输出方法; 了解文件读写位置操作。 熟悉预处理语句; 了解变量作用域; 了解位运算;,文件输入/输出(复习),文件输入/输出过程,打开文件,首先在程序文件的头部应有如下语句: #include ,stream (流,读写通道),程序结束前应该关闭文件,!,程序,文件,打开文件(复习),例如:以只读方式打开一个文件“hello.c”。 fp = fopen(“hello.c”, “r”); 例如:以写方式打开一个文件“output.dat
2、”,该将文件位于C:盘根目录下。 fp = fopen(“c:output.dat”, “w”);,读写文件(复习),字符输入函数: int fgetc (FILE * fp ); 从fp所指向的文件中读取一个字符并返回。若文件结束或调用失败,返回EOF 字符输出函数: int fputc ( int ch, FILE * fp ); 将字符ch写入fp所指向的文件。若成功,则返回写入的字符;若失败,返回EOF,关闭文件(复习),关闭文件函数: int fclose (FILE* fp ); 关闭fp文件指针所指向的文件,并释放fp文件指针。若成功关闭,返回0,否则返回EOF,例:将文件in.
3、doc拷贝至新文件out.doc中。,#include void main() char ch; FILE * in, * out; if(in=fopen(“in.doc“,“r“)=NULL) printf(“Cant open in.doc!“); return; if(out=fopen(“out.doc“,“w“)=NULL) printf(“Cant open out.doc!“); return; while( (ch = fgetc(in) !=EOF ) fputc(ch,out); fclose(in); fclose(out); ,结果:不能正确读取in.doc!,?,打
4、开文件(续)*,文本文件与二进制文件 例:整数 1949 (0x079d), 使用printf %d输出,C语言支持文本形式和二进制形式的文件操作,无论那种形式,都把文件看作一个字节的序列,对文件的存取是以字节为单位进行的。,1 9 4 9,文本文件便于显示,二进制文件节省存储空间,处理速度快,一般用于保存大量数据。,文件,打开文件(续) *,以二进制流打开文件的方式包括: “rb”: 表示读; “wb”: 表示写; “ab”: 表示添加; “rb+”: 表示读写已有文件; “wb+”: 表示读写新文件; “ab+” : 表示读及添加;,文件结束判断,在二进制文件中不设EOF标志(因为-1为合
5、法数据),文件结束测试函数: feof ( fp ); 若最近一次读取fp所指向的文件时,读取了文件尾部,则返回非0值,否则返回0,文件结束判断(续),test.txt: abc,int count = 0; int ch; while(!feof(fp) fgetc(ch,fp); count+ +; ,count值:,1,ch值:,a,2,b,3,c,尾部:最后一个字节后,4,-1,#include void main() char ch; FILE * in, * out; if(in=fopen(“in.doc“,“rb“)=NULL) printf(“Cant open in.doc
6、!“); exit(1); if(out=fopen(“out.doc“,“wb“)=NULL) printf(“Cant open out.doc!“); exit(1); ch = fgetc(in); while( !feof(in) ) fputc(ch,out); ch = fgetc(in); fclose(in); fclose(out); ,这种文件读写方法可用于任何类型的文件,包括文本文件,能否改成: while (!feof(in) ch=fgetc(in); fputc(ch,out); ,问题6.1,问题:UNIX下有一个命令cat,其用法为: cat x.c y.c
7、z.c 其在标准输出(屏幕)上依次显示每个文件内容。如果没有文件名,则显示标准输入中的内容。它类似于Windows的Command环境下的type命令。,问题6.1:算法设计,主要算法如下: If 没有命令行参数 从标准输入中读取内容并显示到屏幕上; Else While 还有文件未读取 打开文件; 从文件输入中读取内容并显示到屏幕上; 关闭文件;,设计一个函数: void filecopy(FILE *fp) 从文件或标准输入中输入并显示到屏幕上。,问题6.1:代码实现,#include void filecopy(FILE *fp); int main( int argc, char *a
8、rgv ) FILE *fp; int i=1; if( argc = = 1) filecopy(stdin); else while( iargc ) if( fp = fopen(argvi+, “r”) = = NULL) printf(“cat: cant open %sn”, *argv); return 1; else filecopy(fp); fclose(fp); return 0; ,void filecopy( FILE *fp) int c; while(c = fgetc(fp) != EOF) fputc(c, stdout); ,错误处理及出口,出错时可调用ex
9、it(1), 非正常出口。 一般正常退出可调用exit(0)。 函数exit为每个打开的文件调用fclose,清除缓冲区,再通过系统调用命令_exit退出。,错误处理及出口(续),对上例cat程序可作如下修改。 main( int argc, char *argv ) FILE *fp; if( argc = = 1) filecopy(stdin); else while(-argc 0) if( fp = fopen(*+argv, “r”) = = NULL) printf(“cat: cant open %sn”, *argv); return 1; else filecopy(fp)
10、; fclose(fp); return 0 ,fprintf(stderr, “cat: cant open %sn”, *argv); exit(1);,exit(0);,exit函数通常用于当存在多层函数调用时退出程序。,行输入/输出,char *fgets(char *s, int n, FILE *fp) 从fp上最多读入n-1个字符,放入s 字符数组中。返回s或NULL。 int fputs( char *s, FILE *fp) 把字符串s(不一定含n)写入文件fp中。返回非负数或EOF。 fgets正常读入换行字符(与gets不同); fputs不在输出后自动加换行字符(与pu
11、ts不同); fgets能设置字符的最大个数,因此,当无法确定所读入的数据行有多长时,最好使用fgets,而不用gets。如: fgets(buf, 81, stdin);,while ( fgets( s, 81, fp ) != NULL ) ,文件格式化输入/输出,文件格式化输入/输出函数: fscanf(fp, format, ) fprintf(fp, format, ) 比scanf、printf函数分别多了一个文件指针参数。,例如:从文件student.in中读入最多不超过50个学生的学生信息,分别以姓名顺序(从低到高)将学生信息输出到文件student.out中。,4 1 li
12、san 22 45 wang 23 54 liu 20 110 zhang 19,返回成功读入的 数据个数,若到达 文件末尾或转换 出错,则返回EOF,文件格式化输入/输出(程序实例),int main() struct student stu50; int number, i; FILE *in,*out; in=fopen(“studentin.in“,“r“); out=fopen(“studentout.out“,“w“); fscanf(in,“%d“, ,struct student int id; char name7; int age; ;,文件格式化输入/输出,举例:读入文件
13、中的单词(假如单词数不超过100,每个单词长度不超过100个字符) 问题分析: 1、如何判断是否读完? 利用fscanf的返回值,若大于0,则未读 完,否则,读完或读入错误。 2、如何保存读入的单词? char words100101; char *pwords100;,文件,读入单词:,char words100101; int i=0; while ( fscanf ( in, “%s“, wordsi ) 0 ) i+;,char * pwords100, temp101; int i=0; while ( fscanf( in, “%s“, temp ) 0 ) pwordsi = (
14、 char * ) malloc( strlen(temp)+1 ); strcpy ( pwordsi, temp ); i+; ,读写文件(续),其它文件读写常用函数: getc( fp ), putc(c, fp) 而getc, putc和fgetc,fputc的区别是fgetc和fputc是函数,而getc和putc是宏定义。,块输入/输出,size_t fwrite(const void *ptr, size_t size, size_t nobj, FLE *fp) 从指针ptr所指的对象中,向文件fp中写入大小为size的nobj个对象。其返回值为实际写入的对象数。 size_t
15、 fread(void *ptr, size_t size, size_t nobj, FILE *fp) 从文件fp中读入大小为size的nobj个对象,放入指针ptr所指的对象中。其返回值为实际读入的对象数。 通常它们被用来输入或输出象结构这样的成块数据。如: fwrite(buf, sizeof(struct student), n, fp); fread(buf, sizeof(struct student), n, fp);,块输入/输出(续),注意: 块输入/输出又称直接输入/输出,不进行数据格式的转换 ,因此属于二进制流形式的输入/输出操作。 用fwrite函数写入数据的文件,其
16、内容一般无法用普通的编辑器查看或修改。 一般用于保存数据,为了以后重新读取使用。 fwrite和fread函数一般配对使用: 用fwrite写入的数据一般通过fread函数读取; 用fread读取的数据也一般是用fwrite函数写入的。,文件读写位置与随机输入/输出,每个正在读写的文件都有一个当前文件读写位置。 如何得到当前文件读写位置? long ln = ftell(fp); 返回fp所指文件的读写指针当前位置,即相对于文件开始处的位移量,单位是字节。若调用失败,返回-1。,文件读写位置与随机输入/输出(续),如何改变文件读写位置? 通常在做顺序读写时,不用关心文件读写位置。 可用下面函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言高级语言程序设计一-第六章 高级程序设计 语言 高级 语言程序设计 第六 程序设计
链接地址:https://www.31doc.com/p-5016986.html