




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级语言程序设计高级语言程序设计(一一)(c programming)第六讲:高级程序设计第六讲:高级程序设计本章目标本章目标n掌握文件结束判断方法;掌握文件结束判断方法;n掌握文件格式化输入掌握文件格式化输入/输出方法;输出方法;n了解文件块输入了解文件块输入/输出方法;输出方法;n了解文件读写位置操作。了解文件读写位置操作。n熟悉预处理语句;熟悉预处理语句;n了解变量作用域;了解变量作用域;n了解位运算;了解位运算;文件输入文件输入/输出(复习)输出(复习)n文件输入文件输入/输出过程输出过程打开文件打开文件读写文件读写文件关闭文件关闭文件首先在程序文件的头部应首先在程序文件的头部应有如下
2、语句:有如下语句:#include stream(流,读写通道)(流,读写通道)程序结束前应程序结束前应该关闭文件该关闭文件!程序程序文件文件打开文件(复习)打开文件(复习)n例如:以只读方式打开一个文件例如:以只读方式打开一个文件“hello.c”。fp = fopen(“hello.c”, “r”);n例如:以写方式打开一个文件例如:以写方式打开一个文件“output.dat”,该将,该将文件位于文件位于c:盘根目录下。:盘根目录下。fp = fopen(“c:output.dat”, “w”);读写文件(复习)读写文件(复习)n字符输入函数:字符输入函数:int fgetc (file
3、* fp );从从fp所指向的文件中所指向的文件中读取一个字符并返回读取一个字符并返回。若文。若文件结束或调用失败,返回件结束或调用失败,返回eofn字符输出函数:字符输出函数:int fputc ( int ch, file * fp );将将字符字符ch写入写入fp所指向的文件所指向的文件。若成功,则返回。若成功,则返回写入的字符;若失败,返回写入的字符;若失败,返回eof关闭文件(复习)关闭文件(复习)关闭文件函数:关闭文件函数:int fclose (file* fp );关闭关闭fp文件指针所指向的文件,并释放文件指针所指向的文件,并释放fp文件指针。文件指针。若成功关闭,返回若成功
4、关闭,返回0,否则返回,否则返回eof例:将文件例:将文件in.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);结果:不能正
5、确结果:不能正确读取读取in.doc!?打开文件(续)打开文件(续)*n文本文件与二进制文件文本文件与二进制文件例:整数 1949(0 x079d), 使用printf %d输出c语言支持文本形式和二进制形式的文件操作,无论那语言支持文本形式和二进制形式的文件操作,无论那种形式,都把文件看作一个种形式,都把文件看作一个字节的序列字节的序列,对文件的存,对文件的存取是以取是以字节字节为单位进行的。为单位进行的。00110001 00111001 00110100 00111001文本形式文本形式 1 9 4 900000111 10011101二进制形式二进制形式文本文件便于显示,二进制文件节省
6、存储空间,处理文本文件便于显示,二进制文件节省存储空间,处理速度快,一般用于保存大量数据。速度快,一般用于保存大量数据。文件打开文件(续)打开文件(续) *以二进制流打开文件的方式包括:以二进制流打开文件的方式包括: “rb”: 表示读;表示读;“wb”: 表示写;表示写;“ab”: 表示添加;表示添加;“rb+”:表示读写已有文件;表示读写已有文件;“wb+”:表示读写新文件;表示读写新文件;“ab+” :表示读及添加;表示读及添加;文件结束判断文件结束判断在在二进制文件二进制文件中不设中不设eof标志(因为标志(因为-1为合法数为合法数据)据)文件结束测试函数:文件结束测试函数:feof
7、( fp );若最近一次读取若最近一次读取fp所指向的文件时,读取了文件尾部所指向的文件时,读取了文件尾部,则返回非,则返回非0值,否则返回值,否则返回0文件结束判断(续)文件结束判断(续)test.txt:abcint count = 0;int ch;while(!feof(fp)fgetc(ch,fp);count+ +;count值:值: 1ch值:值:a2b3c尾部:尾部:最后一最后一个字节个字节后后4-1#include void main()char ch;file * in, * out;if(in=fopen(in.doc,rb)=null)printf(cant open
8、in.doc!); 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.1n问题:问题:unix下有一个命令下有一个命令cat
9、,其用法为:,其用法为:cat x.c y.c z.c 其在标准输出(屏幕)上依次显示每个文件内容。其在标准输出(屏幕)上依次显示每个文件内容。如果没有文件名,则显示标准输入中的内容。它类如果没有文件名,则显示标准输入中的内容。它类似于似于windows的的command环境下的环境下的type命令。命令。问题问题6.1:算法设计:算法设计n主要算法如下:主要算法如下:if if 没有命令行参数没有命令行参数从标准输入中读取内容并显示到屏幕上;从标准输入中读取内容并显示到屏幕上;else else while while 还有文件未读取还有文件未读取 打开文件;打开文件;从文件输入中读取内容并
10、显示到屏幕上;从文件输入中读取内容并显示到屏幕上;关闭文件;关闭文件;设计一个函数设计一个函数:void filecopy(file *fp)从文件或标准输入中输从文件或标准输入中输入并显示到屏幕上。入并显示到屏幕上。问题问题6.1:代码实现:代码实现#include void filecopy(file *fp);int main( int argc, char *argv )file *fp;int i=1; if( argc = = 1) filecopy(stdin);else while( i 0)if( fp = fopen(*+argv, “r”) = = null) print
11、f(“cat: cant open %sn”, *argv); return 1;else filecopy(fp); fclose(fp); return 0fprintf(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
12、( char *s, file *fp)把字符串把字符串s(不一定含(不一定含n)写入文件)写入文件fp中。返回非负数或中。返回非负数或eof。l fgets正常读入正常读入换行字符换行字符(与(与gets不同);不同);l fputs不在输出后自动加换行字符(与不在输出后自动加换行字符(与puts不同);不同);l fgets能设置字符的最大个数,因此,当无法确定所读入的数能设置字符的最大个数,因此,当无法确定所读入的数据行有多长时,最好使用据行有多长时,最好使用fgets,而不用,而不用gets。如:。如: fgets(buf, 81, stdin);while ( fgets( s, 8
13、1, fp ) != null ) 文件格式化输入文件格式化输入/输出输出文件格式化输入文件格式化输入/ /输出函数:输出函数:fscanf(fp, format, )fscanf(fp, format, )fprintf(fp, format, )fprintf(fp, format, )比比scanfscanf、printfprintf函数分别多了一个文件指针参数。函数分别多了一个文件指针参数。例如:从文件例如:从文件student.in中读入最多不超过中读入最多不超过50个学生的学生信个学生的学生信息,分别以姓名顺序(从低到高)将学生信息输出到文件息,分别以姓名顺序(从低到高)将学生信息
14、输出到文件student.out中。中。41 lisan 2245 wang 2354 liu 20110 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,&number);for (i=0;inum
15、ber;i+)fscanf(in,%d%s%d,&stui.id,,&stui.age);sortbyname(stu,number);for (i=0;i0 )i+;char * pwords100, temp101;int i=0;while ( fscanf( in, %s, temp ) 0 ) pwordsi = ( char * ) malloc( strlen(temp)+1 );strcpy ( pwordsi, temp );i+;读写文件(续)读写文件(续)其它文件读写常用函数:其它文件读写常用函数:getc( fp ), putc(c, fp)而而get
16、c, 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 fread(void *ptr, size_t size, size_t nobj, file *fp)从文件从文件
17、fp中读入大小为中读入大小为size的的nobj个对象,放入指针个对象,放入指针ptr所指的对所指的对象中。其返回值为实际读入的对象数。象中。其返回值为实际读入的对象数。 通常它们被用来输入或输出象结构这样的成块数据。如:通常它们被用来输入或输出象结构这样的成块数据。如:fwrite(buf, sizeof(struct student), n, fp); fread(buf, sizeof(struct student), n, fp);块输入块输入/输出(续)输出(续)注意:注意: 块输入块输入/输出又称直接输入输出又称直接输入/输出,不进行数据格式的转输出,不进行数据格式的转换换 ,因此
18、属于,因此属于二进制流形式二进制流形式的输入的输入/输出操作。输出操作。 用用fwrite函数写入数据的文件,其内容一般函数写入数据的文件,其内容一般无法用普通无法用普通的编辑器查看或修改的编辑器查看或修改。 一般用于保存数据,为了一般用于保存数据,为了以后重新读取使用以后重新读取使用。 fwrite和和fread函数一般函数一般配对使用配对使用: 用用fwrite写入的数据一般通过写入的数据一般通过fread函数读取;函数读取; 用用fread读取的数据也一般是用读取的数据也一般是用fwrite函数写入的。函数写入的。文件读写位置与随机输入文件读写位置与随机输入/输出输出n每个正在读写的文件
19、都有一个当前文件读写位置。每个正在读写的文件都有一个当前文件读写位置。n如何得到当前文件读写位置?如何得到当前文件读写位置?long ln = ftell(fp);long ln = ftell(fp);返回返回fp所指文件的读写指针当前位置,即相对于文所指文件的读写指针当前位置,即相对于文件开始处的位移量,单位是字节。若调用失败,件开始处的位移量,单位是字节。若调用失败,返回返回-1。 文件读写位置与随机输入文件读写位置与随机输入/输出(续)输出(续)n如何改变文件读写位置?如何改变文件读写位置?l通常在做顺序读写时,不用关心文件读写位置。通常在做顺序读写时,不用关心文件读写位置。l可用下面
20、函数来改变文件读写位置:可用下面函数来改变文件读写位置:fseek ( fp, offset, origin );fseek ( fp, offset, origin );将将fpfp所指向文件的读写指针相对于所指向文件的读写指针相对于originorigin移动移动offsetoffset个字节。若成功,返回个字节。若成功,返回0 0,否则返回非,否则返回非0 0值。值。origin在在stdio.h文件中有定义,可取以下值:文件中有定义,可取以下值:常量标识符常量标识符值值含义含义seek_set0文件开始位置文件开始位置seek_cur1文件读写指针当前位置文件读写指针当前位置seek_
21、end2文件结束位置文件结束位置例如:例如:fseek(fp, 0, seek_set); 将文件指针移至文件头将文件指针移至文件头fseek(fp, -5, seek_end); 将文件指针移至距文件尾将文件指针移至距文件尾5字节处字节处文件读写位置与随机输入文件读写位置与随机输入/输出(续)输出(续)文件复位函数:文件复位函数:void rewind ( file * fp );将将fp所指向文件的读写指针重新定位到所指向文件的读写指针重新定位到文件的开始。文件的开始。sscanf(char * s, char *format , pointer) 从字符串从字符串s中读取数据并转换成相应
22、数据格式的变量;中读取数据并转换成相应数据格式的变量;格式转换方式同格式转换方式同scanf。lsscanf适合用来将字符数据转换成整数、浮点数或较短的字适合用来将字符数据转换成整数、浮点数或较短的字符串,它通常用以将事先读入的一行数据,依其不同的字符串,它通常用以将事先读入的一行数据,依其不同的字段分开。如:段分开。如:char *buf = “123.456 + 595.36”;float val1, val2;char oper;sscanf(buf, “%f %c %f”, &val1, &oper, &val2);其它常用库函数其它常用库函数sprintf(char * s, cha
23、r *format , arg) 把变量转换成相应格式后,保存到字符串把变量转换成相应格式后,保存到字符串s中;中;格式转换方式同格式转换方式同printf。l当需要把某种类型的数据转换成字符串时,当需要把某种类型的数据转换成字符串时,sprintf就特别有就特别有用。如:用。如:char buf100, *cmd= “test”;int width = 80;double x = 5.67;sprintf(buf, “%s %d %f”, cmd, width, x);printf(“%sn”, buf);其它常用库函数(续)其它常用库函数(续)其它常用库函数(续)其它常用库函数(续)n字符
24、类别测试和转换字符类别测试和转换#include isalpha(c)c为字母,则为非为字母,则为非0;否则结果为;否则结果为0isupper(c)islower(c)isdigit(c)isspace(c)c为空白、换行、制表符,则为非为空白、换行、制表符,则为非0;否则结果;否则结果为为0toupper(c)将将c转换成大写字母转换成大写字母tolower(c)将将c转换成小写字母转换成小写字母#define isupper(c ) (c =a & c=z)?1:0其它常用库函数(续)其它常用库函数(续)nungetc(c, fp)#include 把字符把字符c退回到文件退回到文件fp
25、中。中。n 系统调用系统调用#include system(s) 执行字符串执行字符串s中的命令。如中的命令。如system(“date”);显示日显示日期和时间。期和时间。n 存贮管理存贮管理#include void *malloc(size_t size);void *calloc(size_t nobj, size_t n);void free(void *p);其它常用库函数(续)其它常用库函数(续)n串操作串操作#include char *strcpy(char *s1, char *s2);char *strcat(char *s1, char *s2);int strcmp(
26、char *s, char *t);int strlen(char *s);char *strchr(char *s, char c);char *strstr(char *s1, char *s2);n转换函数转换函数#include double atof(const char *s);int atoi(const char *s);long atol(const char *s);预处理程序预处理程序n预处理关键字:预处理关键字:#define #undef #include #if #ifdef#ifndef #else #endif #linec源程序#include#define#
27、ifc预处理程序c编绎器执行程序预处理程序:预处理程序:includen包含文件(包含文件(include)格式:格式:#include “文件名文件名”一般头文件一般头文件#inlcude 系统头文件系统头文件 编译程序以该文件名的内容来替换该控制行,通编译程序以该文件名的内容来替换该控制行,通常在每个源文件开头出现这样的行,是为了包含常在每个源文件开头出现这样的行,是为了包含公共的公共的#define和外部变量的说明以及函数原型和外部变量的说明以及函数原型。预处理程序:预处理程序:include(续)(续)n使用使用#include可把其它文件(往往是可把其它文件(往往是.h文件)的内文件
28、)的内容包含进来,容包含进来,#include还允许嵌套使用,如:还允许嵌套使用,如:s.c#include “f.h”f.h#include “r.h”r.h预处理程序:预处理程序:include(续)(续)n使用使用#include的优点的优点 可以把所有公共的、需要给程序各个函数共享可以把所有公共的、需要给程序各个函数共享的的外部变量说明、函数原型和宏定义、类型定外部变量说明、函数原型和宏定义、类型定义等都放在某一文件上义等都放在某一文件上(通常以(通常以.h为文件后缀为文件后缀)。其它文件的开头只须用一条)。其它文件的开头只须用一条#include “该该.h”文件的语句,就可以文件的
29、语句,就可以省去重写省去重写这些说明、定义这些说明、定义的麻烦,而且的麻烦,而且程序结构更为清晰程序结构更为清晰。如:。如:#include #include #include “local.h”预处理程序:预处理程序:ifn条件编译(条件编译(if) c语言预处理程序提供了根据条件对程序段进行语言预处理程序提供了根据条件对程序段进行有选择地编译的能力,而这些控制行本身不参加有选择地编译的能力,而这些控制行本身不参加编译。编译。条件编译形式如下:条件编译形式如下:#if 常量表达式常量表达式#ifdef 标识符标识符#ifndef 标识符标识符预处理程序:预处理程序:if(续)(续)*如:如:
30、#if 常量表达式常量表达式程序段程序段1- 常量表达式为真时编译常量表达式为真时编译#else程序段程序段2- 常量表达式为假时编译常量表达式为假时编译#endif又如:又如:#ifdef spe_ver- spe_ver已定义时编译已定义时编译#else- spe_ver未定义时编译未定义时编译#endif预处理程序:预处理程序:if(续)(续)我们经常可在一些头文件中见到下面语句:我们经常可在一些头文件中见到下面语句:#ifndef first#define first#endif可用它们来避免该头文件被重复包含。可用它们来避免该头文件被重复包含。变量作用域变量作用域n变量作用域:变量的
31、使用范围;变量作用域:变量的使用范围;n在在同一个作用域内,不允许定义同名变量同一个作用域内,不允许定义同名变量;n在在不同作用域内,允许定义同名变量不同作用域内,允许定义同名变量。如果同名。如果同名变量作用域重叠,则变量作用域重叠,则内层变量将屏蔽外层变量内层变量将屏蔽外层变量; 变量作用域变量作用域外部变量外部静态变量局部变量或内部静态变量程序文件函数变量作用域图变量作用域(续)变量作用域(续)例:例:#include int i = 0;main( )int i = 1;printf(“i=%d, ”, i);int i = 2;printf(“i=%d, ”, i);i += 1;pr
32、intf(“i=%d, ”, i);printf(“i=%d, ”, i);printf(“i=%dn ”, i);结果:?i=1, i=2, i=3, i=3, i=1注意:在程序中出现作用域重注意:在程序中出现作用域重叠的同名变量不是一个好的程叠的同名变量不是一个好的程序设计风格。序设计风格。静态变量(静态变量(static)* 内部静态变量内部静态变量l在局部变量前加上在局部变量前加上“static”关键字就成为内部静态变量。关键字就成为内部静态变量。l内部静态变量仍是局部变量,其作用域仍在定义它的函数内。内部静态变量仍是局部变量,其作用域仍在定义它的函数内。但该变量采用静态存贮分配(由
33、编译程序在编译时分配,而一但该变量采用静态存贮分配(由编译程序在编译时分配,而一般的自动变量和函数形参均采用动态存贮分配,即在运行时分般的自动变量和函数形参均采用动态存贮分配,即在运行时分配空间),当函数执行完,返回调用点时,该变量并不撤消,配空间),当函数执行完,返回调用点时,该变量并不撤消,其值将其值将继续保留继续保留,若,若下次再进入该函数时,其值仍存在下次再进入该函数时,其值仍存在。外部静态变量外部静态变量l在函数外部定义的变量前加上在函数外部定义的变量前加上“static”关键字便成了外部静态关键字便成了外部静态变量。变量。l外部静态变量的作用域为定义它的文件,即成为外部静态变量的作用域为定义它的文件,即成为该文件的的该文件的的“私有私有”(private)变量)变量,其它文件上的函数一律不得直接进行其它文件上的函数一律不得直接进行访问访问,除非通过它所在文件上的各种函数来对它进行操作,这,除非通过它所在文件上的各种函数来对它进行操作,这可实现数据隐藏。可实现数据隐藏。(在在c+中提供进一步的数据隐藏。中提供进一步的数据隐藏。)静态变量(静态变量(static)(续)(续)*例:下列程序打印出什么结果。例:下列程序打印出什么结果。 #include int f(int i);main() int i; for(i=0; i 按位右移,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急安全培训咨询课件
- 2025年甘肃中医药大学附属医院(第三期)考核招聘编外专业技术人考前自测高频考点模拟试题及答案详解(新)
- 2023山东省蓬莱市北师大版7年级数学上册期中考试黑钻押题附参考答案详解(巩固)
- 2024年自考专业(国贸)高分题库【名师系列】附答案详解
- 承兑汇票购销合同(标准版)
- 设立分公司合同(标准版)
- 2025年度生态环境部松辽流域生态环境监督管理局生态环境监测与科考前自测高频考点模拟试题及答案详解(必刷)
- 2025年公务员考试《常识》检测卷附参考答案详解【轻巧夺冠】
- 2025年工业互联网平台射频识别(RFID)技术在物流行业应用深度研究报告
- 2025年文化产业园产业集聚与文化产业发展政策环境报告
- 福建台湾海峡大桥建设工程可行性研究报告
- (完整)注册安全工程师考试题库(含答案)
- 高考作文素材积累与写法总结27 自知与知人作文审题指导及素材积累
- 电子政务概论-形考任务5(在线测试权重20%)-国开-参考资料
- 2024年贵州省贵阳市中考生物地理合卷试题(含答案逐题解析)
- DNDC模型使用手册
- 起重机械生产单位质量安全总监-特种设备考试题库
- JBT 9189-2016 水基材料防锈试验方法 铸铁屑试验
- JJF 1064-2024 坐标测量机校准规范
- 《春江花月夜》省公开课金奖全国赛课一等奖微课获奖课件
- 人音版小学六年级上册音乐教案(本)
评论
0/150
提交评论