250 likes | 455 Views
C 语言程序设计. 同学们好!下面开始讲授 C 语言课程的第 16 讲内容。 第 16 讲 文件( 2 ) 四、二进制文件的访问操作 五、课程总复习 四、二进制文件的访问操作 ( 1 )读出和写入信息的函数 对二进制文件是按固定字节数进行信息读写访问操作的。调用在 stdio.h 头文件中声明的 fread() 函数能够从二进制文件中读出固定字节数的信息,调用 fwrite() 函数能够向二进制文件中写入固定字节数信息。这两个函数的原型为: unsigned int fread(void *buffer, unsigned int num,
E N D
C语言程序设计 同学们好!下面开始讲授C语言课程的第16讲内容。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习 四、二进制文件的访问操作 (1)读出和写入信息的函数 对二进制文件是按固定字节数进行信息读写访问操作的。调用在stdio.h头文件中声明的fread()函数能够从二进制文件中读出固定字节数的信息,调用fwrite()函数能够向二进制文件中写入固定字节数信息。这两个函数的原型为: unsigned int fread(void *buffer, unsigned int num, unsigned int count, FILE *stream); unsigned int fwrite(const void *buffer, unsigned int num, unsigned int count, FILE *stream); 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 参数说明:stream参数给出要进行操作的二进制文件流,num和count参数分别表示待读写的信息块中一种数据类型的长度和个数,它们之积为信息块的字节数,buffer参数所指向的存储空间是信息在内存中的保存地点。 函数功能:调用fread函数是从stream所表示的文件中当前字节位置读出num*count个字节的信息并保存到由buffer所指向的存储空间中。调用fwrite函数是把从buffer所指向的存储空间中的num*count个字节的信息写入到由stream所表示的文件中,从当前字节位置起向后存放。 (2)移动文件指针位置(当前待读写的字节位置) 在stdio.h头文件中还提供有移动文件指针位置的函数: int fseek(FILE *stream, long int num, int origin); 功能:利用该函数可以把文件指针位置移动到整个文件中的任何字节位置。随时从这个位置起读写信息。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 参数说明: stream参数给出要进行操作的文件流。 origin参数必须是三个符号常量SEEK_SET、SEEK_CUR或SEEK_END之一。它们在stdio.h头文件中定义。 SEEK_SET表示文件开始位置,即第1个字节位置; SEEK_END表示文件结尾位置,即保存文件结束标记的位置; SEEK_CUR表示当前的文件指针位置。 num参数给出移动文件位置指针的位移量,为正数时则表示从origin所给的参考点向后移动num个字节,为负数时表示向前移动num个字节,移动后的位置就是当前的文件指针位置。 调用该函数时,若文件位置指针移动成功,则返回0,否则返回非0值。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 (3)应用举例 例1 编一程序,首先利用48、62、25、73、66、80、78、54、36、47等10个整数初始化一个整型数组a[10],接着把a中每个元素的值依次写入到二进制文件“d:\cx\data.bin”中,然后再对数组a进行升序排序,把排序结果再一次写入到上述二进制文件中。 分析:首先以二进制写方式打开给定文件,接着把数组a[10]中的数据写入到文件中,再接着对数组a[10]进行升序排列,最后再把数组a[10]中的数据写入到文件中。对数组a[10]进行升序排列可以单独编写出函数定义。程序如下: #include<stdio.h> #include<stdlib.h> int a[10]={48,62,25,73,66,80,78,54,36,47};//定义并初始化数组 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 void SeleteSort(int a[], int n)//对数组a[10]进行升序排序 {//采用选择排序方法 int i,j,k,x; for (i=1; i<n; i++) {//顺序比较和交换n-1次 k=i-1; for (j=i; j<n; j++)//k为当前比较区间内的最小元素下标 if (a[j]<a[k]) k=j; x=a[i-1]; a[i-1]=a[k]; a[k]=x;//交换 } } void main(void) { int i; FILE *fp1; fp1=fopen("d:\\cx\\data.bin", "wb");//以二进制写打开文件 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 if (!fp1) {printf("文件没有打开!\n"); exit(1);} for (i=0; i<10; i++)//向文件写入a数组中每个元素值 fwrite(&a[i], sizeof(int), 1, fp1); SeleteSort(a,10);//调用排序算法 fwrite(a, sizeof(int), 10, fp1);//把数组a[10]一次写入文件 fclose(fp1);//关闭fp1所对应的文件 } 例2 从例1所建立的二进制文件中,首先读出文件后半部分保存的按升序排列的10个整数并显示,然后再读出前半部分保存的10个整数并显示出来。 分析:根据文件名和访问方式定义文件流,移动文件位置指针,读取后10个有序数据,再把文件指针位置移到文件开始,再读取前10个数据。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 #include<stdio.h> #include<stdlib.h> int a[10]; //用来保存从文件中读取的10个整数 void main(void) { int i; FILE*fp1; fp1=fopen(“d:\\cx\\data.bin", "rb"); //以二进制读打开文件 if (!fp1) {printf("文件没有打开!\n"); exit(1);} fseek(fp1,10*sizeof(int),SEEK_SET); //把文件指针位置移到10个整数之后,即第11个整数位置 fread(a, sizeof(int), 10, fp1); //一次读出后10个整数到a[10]数组中保存 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 for(i=0; i<10; i++) printf("%d ",a[i]); //依次显示出按升序排列的10个整数 printf("\n"); fseek(fp1,0,SEEK_SET); //把文件位置指针移到文件开始位置 for(i=0; i<10; i++) { //依次读出并显示前10个整数 fread(&a[i], sizeof(int), 1, fp1); printf("%d ",a[i]); } printf("\n"); fclose(fp1); //关闭fp1所对应的文件 } 程序运行结果: 25 36 47 48 54 62 66 73 78 80 48 62 25 73 66 80 78 54 36 47 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 例3 编一程序,从键盘上输入若干条Pupil类型的学生记录到“Student.bin”二进制文件中,当输入姓名为“AAA”后结束。假定Pupil类型包含两个域,即学生姓名和成绩。 分析:定义文件流、从键盘输入和向文件流写入每个学生记录、关闭文件。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct Pupil {char name[10]; int grade;}; //定义学生记录结构 struct Pupil x; //定义学生结构变量 void main(void) { char *p="Student.bin"; //定义文件名字符串 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 FILE *fp1=fopen(p, "wb");//以二进制写方式打开文件 if (!fp1) {printf("文件没有打开,退出运行!\n"); exit(1);} printf("请输入若干条学生记录,输入姓名AAA后结束:\n"); while(1) { scanf("%s",x.name);//输入姓名 if (strcmp(x.name,"AAA")==0) break;//输入结束退出循环 scanf("%d",&x.grade);//输入成绩 fwrite(&x, sizeof(x),1,fp1);//向文件写入一条记录 } fclose(fp1); printf("数据输入完成,程序正常结束.\n"); } 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 假定从键盘上输入和显示结果如下: 请输入若干条学生记录,输入姓名AAA后结束: zhshj 76 hgyin 84 shian 68 zhb 92 zjmin 70 xjip 63 AAA 数据输入完成,程序正常结束. 此6条学生记录被依次保存到“Student.bin”二进制文件中,每个记录所占有的字节数为sizeof(struct Pupil),这个文件占有6*sizeof(struct Pupil)+1字节。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 例4 编一程序,从例3建立的“Student.bin”二进制文件中,依次读出每个Pupil类型的学生成绩记录,并输出,同时统计出学生记录数。 #include<stdio.h> #include<stdlib.h> struct Pupil {char name[10]; int grade;};//学生类型的定义 void Print(FILE *fio);//打印输出文件中的全部记录 int Count(FILE *fio);//统计出文件中的全部记录数 void main(void) { FILE *fio=fopen("Student.bin", "rb+"); //以二进制的读写方式打开文件 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 if (!fio) {printf("文件没有打开,退出运行!\n"); exit(1);} printf("输出文件中的全部记录:\n"); Print(fio); printf("统计出文件中的全部记录数为: %d\n",Count(fio)); fclose(fio); } void Print(FILE *fio) {//打印输出文件中的全部记录 struct Pupil x; fseek(fio,0,SEEK_SET);//移动文件位置指针到文件开始 while(!feof(fio)) {//依次读出并打印每个学生记录 fread(&x, sizeof(x), 1, fio); if (feof(fio)) break; 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 printf("%s %d\n",x.name,x.grade); } } int Count(FILE *fio) {//统计出文件中的全部记录数 int c=0;//统计变量,初值为0 struct Pupil x; fseek(fio,0,SEEK_SET);//移动文件位置指针到文件开始 while(1) {//依次读出并统计每个学生记录 if (fread(&x, sizeof(x), 1, fio)==0) break; c++; } return c;//返回学生记录数 } 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 输出文件中的全部记录: zhshj 76 hgyin 84 shian 68 zhb 92 zjmin 70 xjip 63 统计出文件中的全部记录数为: 6 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 五、课程总复习 第一、二讲 C语言概述的知识要点 1.了解C语言程序、程序文件、函数定义模块的概念及其相互之间的关系。 2.了解函数的具体定义格式和作用,主函数main()的特殊地位和作用。 3.掌握C语言中简单语句和复合语句的构成。如分号、花括号。 4.掌握#include预处理包含命令的格式与作用。 5.掌握头文件的文件名格式,在程序中的使用方法和作用。 6.掌握C语言中两种注释形式的不同标记。//、/*… … */ 7.掌握标准输出函数printf()和标准输入函数scanf()的定义格式和用法。 8.掌握C语言程序文件名、编译后生成的目标文件名和连接后生成的可执行文件名的命名规则,以及上机输入、编辑、编译、连接和运行程序的过程。.c .obj .exe 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第三、四讲 数据类型和表达式的知识要点 1.掌握C语言中各种简单数据类型的表示和长度。int, char, float, double,void 2.掌握十进制、八进制、十六进制整型的常量表示方法。25、031、0x19 3.掌握十进制定点数、带指数部分的浮点数的表示方法。25.03、2.503e1 4.掌握数值、字符、字符串在程序中书写格式的区别,转义字符。25,’3’,”25”,’\n’ 5.掌握各种类型变量的定义和初始化格式,符号常量的定义格式。#define M 10 6.掌握枚举类型的定义格式。enum <枚举类型名> {<枚举值列表>}。 7.掌握各种常用运算符的表示和含义。算术、比较、赋值、逻辑、增1、减1等。 8.掌握一些常用系统函数的调用格式和作用。 abs(),exp(),pow(),rand(),exit() 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第五、六讲 流程控制语句的知识要点 1.掌握条件语句的格式和作用。(if<条件表达式> <语句1> else <语句2> 2.掌握分情况处理语句的格式和作用。switch<表达式> {每个case子句;default:} 3.掌握for循环语句的格式和作用。for(<表达式1>;<表达式2>;<表达式3>)<语句> 4.掌握while循环语句的格式和作用。while(<表达式>)<语句> 5.掌握do循环语句的格式和作用。do<语句>while(<表达式>); 6.掌握各种跳转语句的格式和作用。goto, return, break, continue 7.会根据现有的程序,分析出程序功能或写出运行结果。 8.会根据处理问题的需要,选择合适的语句编写出程序。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第七、八讲 数组和字符串的知识要点 1.掌握一维数组的定义及初始化格式。int a[10]={20,35,16} 2.掌握二维数组的定义及初始化格式。 int b[3][4]={{1,3,5,7},{2,5,8,10}} 3.掌握数组长度的计算方法,每一维下标的变化范围,数组存储空间大小的计算。 4.掌握数组元素的表示,即一维下标变量、二维下标变量的表示。a[4],b[i][j] 5.掌握利用循环和循环变量控制下标变化依次访问(遍历)数组中所有元素的方法。 int i, a[10]; for (i=0; i<10; i++) printf(“%d ”,a[i]); 6.能够编写程序,利用一维数组存储一批数据,并做相应的数据处理。查找、求和 7.能够编写程序,利用二维数组存储矩阵数据,并做相应的数据处理。查找、矩阵运算 8.掌握利用字符数组存储字符串的存储格式和初始化格式。chars1[10]=”abcdf”; 9.掌握常用字符串处理函数的调用格式和功能。strlen,strcpy,strcmp,strcat 10.掌握typedef语句定义数据类型的格式。typedef int IntData; 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第九、十讲 指针的知识要点 1.掌握指针的概念,指针变量的定义格式和初始化。int x=10, *xp=&x; 2.掌握常用指针运算符的表示和含义。赋值=、取地址&、取内容*、比较==、!=、> 3.掌握数组名的指针含义。int a[10], *p=a; 4.掌握一维数组元素的下标访问方式与指针访问方式之间的关系。a[i],*(a+i) 5.掌握二维数组元素的下标访问方式与指针访问方式之间的关系。b[i][j],*(b[i]+j) 6.掌握动态存储分配函数malloc()和calloc()的调用格式及作用。malloc(20) 7.会分析和编写带有指针运算和动态存储分配的程序。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第十一、十二讲 函数的知识要点 1.掌握函数的定义、调用和声明的格式。 int f(int n){return n*n;} int f(int n);x=f(10); x=100 2.掌握函数定义中值参数和指针参数的不同作用。void h(int x, int* a) 3.掌握函数参数为一维数组或二维数组时的说明格式及作用。int ff(int a[], int n) 4.掌握变量的作用域范围和分类。全局变量、局部变量、静态(static)变量 5.掌握函数的递归定义和调用的概念。调用自身函数 6.掌握函数调用时参数的传递过程和函数体的执行与返回过程。 7.能够根据现有的函数定义分析函数功能,或根据某种功能写出函数定义。 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第十三、十四讲 结构与联合的知识要点 1.了解结构和联合类型的概念和作用。组合数据类型 2.掌握结构类型的定义格式,结构对象(变量)的定义格式和初始化。 3.能够计算出结构类型的长度。各成员类型的长度之和。 4.掌握对结构的成员进行访问的方法。点和箭头运算符 5.掌握链表中结点的结构,链表的建立和遍历的方法和算法。 struct IntNode {int data; struct IntNode *next;}; 6.掌握联合类型的定义格式和长度计算方法,结构与联合的异同。 7.会利用结构类型存储和处理数据,会利用链表存储和处理数据。偏重分析 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 第十五、十六讲 文件的知识要点 1. 了解数据文件的有关概念。文件名、存储位置、文件类型(字符、字节)、文件流 2. 掌握数据文件的打开和关闭方法。fopen(), fclose() 3. 掌握数据文件的各种访问方式的表示方法。"r", "w", "a", "wb", "r+" 4. 掌握对字符类型的数据文件进行输入和输出数据的方法。fputc(), fgetc() 5. 掌握对字节类型的数据文件进行输入和输出数据的方法。fread(), fwrite() 6.会利用字符或字节类型的数据文件保存和处理数据。偏重分析 这一讲是IP课程的最后一讲,希望同学们能够认真学习好这门课程,取得比较满意的学习效果! 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 五、课程总复习 运算对象:常量(字面、符号)、变量(简单、数组、指针)、函数(标准、用户)、表达式(算术、逻辑) 数据类型:整数型、实数型、字符型、枚举、结构、联合、指针 运算符:算术、比较、逻辑、圆括号等 用于键盘和显示器的标准输入和输出函数:scanf(); printf() 流程控制语句:if、switch、for、while、do-while、break、continue、return、go等。 动态存储分配函数:calloc(); malloc(); realloc(); free() 数据文件:文件名、文件访问方式、文件流、字符和二进制文件、字符文件的读写函数、二进制文件的读写函数 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习
C语言程序设计 程序结构:头文件、程序文件(一般、主函数)、函数定义声明及调用 对象作用域:常量、变量、类型,函数定义内外,函数参数 复习考试:概念(选择和填空)、理解(程序运行结果、函数功能)、应用(编程) 这一讲是IP课程的最后一讲,希望同学们能够认真学习好这门课程,取得比较满意的学习效果! 第16讲 文件(2) 四、二进制文件的访问操作 五、课程总复习