版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计创建第一个C语言程序项目1“学生成绩管理系统”中相关数据设计及简单处理项目2项目中学生成绩的等级判定项目3项目中的设计数据处理及封面与菜单的初步项目4学生成绩的分组汇总程序项目5利用数组完善项目中数据的处理项目6利用函数进行项目的整体框架设计项目7利用结构体实现项目项目8利用指针优化项目项目9利用文件完善项目项目10项目10利用文件完善项目目标TARGET知识目标理解文件的概念。
掌握文件的基本操作。
掌握文本文件和二进制文件的读写方法。
掌握文件的定位方法。目标TARGET技能目标学会使用文件进行数据的存储及处理。
能够用文件完善学生成绩管理系统。项目中学生数据的存储和反复使用任务10.1任务10.1项目中学生数据的存储和反复使用
任务描述
在学生成绩管理系统中,所涉及的数据是比较大的,而每次运行程序时都要通过键盘输入数据,非常麻烦。程序退出时,数据也消失,数据只能保存在内存中,不能长期保存。
本任务使用外部存储文件来保存数据,实现对数据的存储和读取,能安全有效地长期保存数据,还能提供数据共享。任务分析案例9中的数据是存储在内存中的,当程序结束运行时,这些数据全部消失。如果能将数据保存在文件中,将大大减少输入工作量,而且输出的结果也可以长期保留。问题的要点是:1)如何将内存中的数据存储在文件中。2)反之,如何从磁盘文件中的数据载入内存。要完成上面的任务,必须了解文件的基本概念,熟练掌握文件读写函数。1认识文件Part◎文件的读写◎文件概述◎学生成绩管理系统的数据存取文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。1.文件的概念文件是指存储在外部介质上的数据集合,为标识一个文件,每个文件都必须有一个文件名,文件名的一般形式为:文件名.[扩展名],其中扩展名是可选的,并按类别命名,例如,C语言源程序的扩展名是C,而可执行文件的扩展名是EXE等等。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。2.文件类型(1)按文件的逻辑结构分1)记录文件:由具有一定结构的记录组成(定长和不定长)。2)流式文件:由一个个字符(字节)数据顺序组成。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。(3)按数据的组织形式分1)文本文件:也称ASCII码文件。这种文件在保存时,每个字符对应一个字节,用于存储对应的ASCII码。2)二进制文件:不是保存ASCII码,而是按二进制的编码方式来保存文件内容。2.文件类型文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。3.文件的用途1)使程序与数据分离,数据文件的改动不会引起程序的改动。2)使数据共享,不同程序可以访问同一数据文件中的数据。3)程序运行的中间数据或者结果数据可以长期保存。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。4.文件的处理方式1)缓冲文件系统:又称为标准文件系统或高级文件系统,是目前常用的文件系统,也是ANSIC建议使用的文件系统。系统自动为正在使用的文件开辟内存缓冲区。可减少主机和外部设备频繁交换数据的次数,缓冲文件系统的输入输出如下图所示。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。4.文件的处理方式2)非缓冲文件系统又称为低级文件系统,它提供的文件输入输出操作函数更接近于操作系统,它不能自动设置缓冲区,而是由用户根据所处理的数据大小在程序中设置,其输入输出示意图如下图所示。因此,非缓冲文件系统的操作与机器本身有关,使用起来较为困难,但它节省内存,执行效率较高。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定义一般情况下,要使用一个文件,系统将在内存中为这一文件开辟一个“文件信息区”,用来存放文件的有关信息,如文件当前的读写位置、缓冲区中未被处理的字符数、文件操作方式、下一个字符的位置、文件缓冲区的位置等。这些信息保存在一个结构体中,该结构体由系统定义的,定义在stdio.h的头文件中。VisualC++6.0系统中具体定义形式为:文件概述
struct_iobuf{char*_ptr;/*文件输入的下一个位置*/int_cnt;/*当前缓冲区的相对位置*/char*_base;/*数据缓冲区的位置*/int_flag;/*文件状态标志*/int_file;/*用于有效性检验*/int_charbuf;/*如无缓冲区不读取字符*/int_bufsiz;/*缓冲区的大小*/char*_tmpfname;/*临时文件名*/};typedefstruct_iobufFILE;文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定义C语言对文件的操作并不是直接通过文件名进行的,而是根据文件名生成一个指向FILE结构类型的指针。也就是首先定义一个FILE的指针,例如:FILE*fp;
通过fp使用结构体变量中的文件信息访问文件。也就是说,C程序中是通过文件指针变量fp找到与它相关的文件的,通过该指针对文件进行操作。注意:1)文件指针所指的是一个名为FILE的结构体类型,在头文件stdio.h中定义,结构体FILE的细节对一般用户来说并不重要,不必详细了解FILE的具体组成结构。2)经过定义的文件指针,就可以用来指向一个文件。3)FILE类型及所有文件的读写函数和相关常量都定义在文件stdio.h中,因此在源程序的开头要包含头文件stdio.h。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。6.文件的打开和关闭文件的读写操作之前,必须先打开文件;使用结束后,为了避免数据丢失,应立即关闭文件。即文件的使用步骤一般为:首先打开文件,然后进行文件的读写操作,最后关闭文件。文件的打开和关闭都是通过函数来实现的。文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。6.文件的打开和关闭(1)文件的打开C语言中,使用fopen()函数来打开文件。格式:FILE*fp;fp=fopen("文件名","操作方式");功能:以指定的操作方式打开一个文件。若文件正常打开,返回指向文件结构体的指针;否则打开失败,返回NULL。说明:1)fopen()函数在执行时返回一个FILE类型的指针,赋给一个文件指针变量fp,使fp与被打开的文件联系起来,而后对文件的读写操作就可以通过fp来进行。2)“文件名”指要打开文件的文件名,若不在当前目录下,则要写绝对路径。3)“操作方式”是指对打开文件的访问形式,取值及含义如表所示。操作方式含义文件不存在时文件存在时r只读(文本文件)出错正常打开w只写(文本文件)建立新文件文件原有内容丢失a添加(文本文件)建立新文件在文件原有内容末尾追加rb只读(二进制文件)出错正常打开wb只写(二进制文件)建立新文件文件原有内容丢失ab添加(二进制文件)建立新文件在文件原有内容末尾追加r+读/写(文本文件)出错正常打开w+写/读(文本文件)建立新文件文件原有内容丢失a+读/添加(文本文件)建立新文件在文件原有内容末尾追加rb+读/写(二进制文件)出错正常打开wb+写/读(二进制文件)建立新文件文件原有内容丢失ab+读/添加(二进制文件)建立新文件在文件原有内容末尾追加文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。6.文件的打开和关闭例如:FILE*fp;fp=fopen("test.txt","r");上面代码表示以读方式打开当前目录下文件名为“text.txt”的文本文件。程序中一般会考虑作容错处理,常用的方法如下:if((fp=fopen("文件名","操作方式"))==NULL){printf("打开文件失败!");exit(0);/*结束程序运行*/}文件概述
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。6.文件的打开和关闭(2)文件的关闭使用完一个文件后,应使用fclose()函数及时关闭。fclose()函数和fopen()函数一样,原型也在stdio.h中,调用的一般形式为:fclose(文件指针);例如:fclose(fp);fclose函数也带回一个值,当正常完成关闭文件时,fclose函数返回值为0(NULL),否则返回-1(EOF),EOF是stdio.h中定义的符号常量,值为-1。EOF也是文件结束的标志。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。1.文本文件的读写C语言提供以字符方式读写文件的函数有:1)写字符函数intfputc(charch,FILE*fp)2)读字符函数intfgetc(FILE*fp)3)写字符串函数intfputs(char*string,FILE*fp)4)读字符串函数char*fgets(char*string,intn,FILE*fp)文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。1.文本文件的读写(1)写字符函数写字符函数fputc()的原型如下:intfputc(charc,FILE*fp)fputc()函数的一般形式如下:ch=fputc(ch,fp);功能:将字符型变量ch的内容写入文件指针fp所指定的文件中。说明:1)ch为字符变量或字符常量。2)fp为FILE类型的文件指针变量,它由fopen()函数赋初值。3)打开文件的方式必须是带“w”或“w+”,并且文件必须存在。文件的读写
#include"stdio.h"voidmain(){FILE*fp;/*定义文件指针*/charchInfo[20];/*定义数组*/inti;fp=fopen("myInfo.txt","w");/*以写文本文件方式打开文件*/if(fp==NULL)/*如果打开失败,则结束程序*/{printf("cannotopenthisfile\n");exit(0);}例10-1编写程序,从键盘输入一串字符“mayfriendshipforever!”,然后保存在文件myInfo.txt中。文件的读写
printf("pleaseinputastring:");gets(chInfo);/*输入一个字符串*/i=0;while(chInfo[i]!='\0')/*将字符数组中的字符写入文件*/{fputc(chInfo[i],fp);/*将字符数组中的一个字符写入文件*/i++;}fclose(fp);/*关闭文件*/例10-1编写程序,从键盘输入一串字符“mayfriendshipforever!”,然后保存在文件myInfo.txt中。说明:1)语句fp=fopen("myInfo.txt","w");以写方式打开文本文件myInfo.txt,若该文件不存在,则建立一个新文件;若该文件存在,则重写该文件。2)文件myInfo.txt所在目录为程序文件所在目录,如果想将文件myInfo.txt存放在指定的目录中,比如目录d:\mydir(该目录存在)中可用如下语句:fp=fopen("d:\\mydir\\myInfo.txt","w");3)用if语句判断文件是否成功打开,如果不成功则直接结束程序。exit()函数的作用是关闭所有文件,终止正在执行的程序。4)while循环语句将输入的字符串中的字符逐个按顺序写入文件myInfo.txt中。5)可以用记事本或DOS中的type命令查看文件myInfo.txt,其内容和输入的内容一致,为:“mayfriendshipforever!”。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。1.文本文件的读写(2)读字符函数读字符函数fgetc()的原型如下:intfgetc(FILE*fp);fgetc()函数的一般形式如下:ch=fgetc(fp);功能:从文件指针fp所指文件中读取一个字符。说明:1)ch为字符变量,用来接收从磁盘文件读入的字符。2)fp为FILE类型的文件指针变量,它由fopen()函数赋初值。3)打开文件的方式必须是带“r”或“r+”,并且文件必须存在。4)fgetc()函数返回一个字符,如果读到文件尾,则返回的是文件结束标志EOF。出错时也返回EOF。文件的读写
#include"stdio.h"voidmain(intargc,char*args[]){FILE*fp;/*定义文件指针*/charch;fp=fopen(args[1],"r")/*以读文本文件方式打开文件,文件名由命令行参数输入*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}
例10-2打开例10.1生成的文件myInfo.txt,将其中的内容显示在屏幕上,要求文件名从命令行参数输入。文件的读写
ch=fgetc(fp);/*读取文件中的一个字符存放到ch中*/while(ch!='\0')/*如果文件没有结束,重复下面的操作*/{putchar(ch);/*显示ch中的字符*/ch=fgetc(fp);/*读取文件中的一个字符存放的ch中*/}fclose(fp);/*关闭文件*/}例10-2打开例10.1生成的文件myInfo.txt,将其中的内容显示在屏幕上,要求文件名从命令行参数输入。说明:1)main()主函数可以有两个参数,第1个参数argc存放命令行参数的个数,第2个参数args[]是一个char型指针数组,用来存放命令行参数的字符串的首地址。命令行参数可以有多个。其中args[0]存放正在执行的文件名,args[1]存放第1个参数,args[21]存放第2个参数,…args[n]存放第n个参数。所以在本程序中,正在执行的文件名“LT10-2.exe”存放在args[0]中,要读取的文件名“myInfo.txt”存放在args[1]中。2)语句fp=fopen(args[1],"r");以只读方式打开文本文件myInfo.txt。3)用if语句判断文件是否成功打开,如果不成功,则输出错误信息,直接结束程序。4)while循环语句从文件头开始逐个读取文件中的字符并输出到屏幕上,当读到文件结束标志EOF时结束循环。EOF在文件stdio.h中定义为-1,是不可显示字符,不能在屏幕上显示。说明:5)C语言中提供了函数feof(),可以用来判断文件是否结束。所以本程序的while循环可以做如下更改:while(!feof(fp)){putchar(ch);ch=fgetc(fp);}feof(fp)用来测试fp所指向的文件当前状态是否为“文件结束”,如果是,则函数值为1(真),否则为0(假)。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。1.文本文件的读写(3)写字符串函数intfputs(char*string,FILE*fp)fputs()函数的一般形式如下:ch=fputs(str,fp);功能:将一个字符串写到文件指针fp所指的文件中。说明:1)fputs()函数带返回值。若输出成功,返回值为0,否则返回值为非零。2)字符串结束符将不被输出。因此,为了读数据的方便,使字符串能分开,往往用fputs("\n",fp)语句在每个字符串后加一个换行符'\n'一起存入文件中。文件的读写
该程序的解题思路和例10-1相近,请参考前面内容。只须对代码做部分修改,需要修改的地方主要有:1)删除语句inti;2)可将语句i=0;while(chInfo[i]!='\0'){fputc(chInfo[i],fp);i++;}改为:fputs(chInfo,fp);例10-3用fputs()函数实现例10-1应如何修改程序?请根据提示写出完整程序。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。1.文本文件的读写(4)读字符串函数char*fgets(char*string,intn,FILE*fp)fgets()函数的一般形式如下:fgets(str,n,fp);功能:从文件指针fp所指的文件中读取一个字符串。说明:1)str为字符数组或字符型指针。2)n为正整数,表示从文件中读取不超过n-1个字符,在读取的最后一个字符后加上串结束符'\0'。如果在完成读取n-1个字符之前,遇到换行符或EOF,则停止读过程。3)fgets()函数的返回值为str的首地址。若读到文件尾或出错,则返回空指针NULL。文件的读写
该程序的解题思路与例10-2相近,请参考前面内容。只需对代码做部分修改,需要修改的地方主要有:1)语句charch;改为char*chInfo;例10-4用fgets()函数实现例10-2应如何修改程序?请根据提示写出完整程序。2)语句ch=fgetc(fp);while(ch!='\0'){putchar(ch);ch=fgetc(fp);}改为:fgets(chInfo,100,fp);printf("%s",chInfo);注意:fgets()函数中的第2个参数为要读取的字符数,要大于或等于文件的长度+1。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。2.二进制文件的读写多数文件是以二进制方式存储,且需要对整块数据进行读写。(1)写数据块函数fwrite()函数的一般形式如下:fwrite(buffer,size,count,fp);功能:将一组数据输出到指定的磁盘文件中。说明:1)buffe用于存放输出数据的缓冲区指针,即要写出数据段的起始地址。2)size是输出的每个数据项的字节数。3)count是指要输出多少个size字节的数据项数,因此字节总数为count*size。4)fp是FILE类型的文件指针变量。文件的读写
#include"stdio.h"voidmain(){intiArray[5];/*定义数组*/inti;FILE*fp;/*定义文件指针*/fp=fopen("test.dat","wb");/*以写二进制文件的方法打开文件*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}
例10-5编一程序从键盘输入5个整数并写入到文件test.dat中。文件的读写
printf("pleaseinput5integers:");for(i=0;i<5;i++)/*输入5个整数存入数组中*/scanf("%d",&iArray[i]);fwrite(iArray,4*5,1,fp);/*将数组中的5个整数写入文件*/fclose(fp);/*关闭文件*/例10-5编一程序从键盘输入5个整数并写入到文件test.dat中。说明:1)fwrite(iArray,4*5,1,fp)将数组iArray中的所有元素整体一次性写入到文件。2)使用fwrite()函数将数组中的元素写入文件时,可以将数组整体一次性写入,也可以逐个元素写入。逐个元素写入时,每次写入一个整数,可以用循环语句实现,代码如下。for(i=0;i<5;i++)fwrite(iArray[i],4,1,fp);3)用fwrite()写入的文件是二进制文件,不能用记事本打开或者用type命令显示。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。2.二进制文件的读写多数文件是以二进制方式存储,且需要对整块数据进行读写。(2)读数据块函数fread()函数的一般形式如下:fread(buffer,size,count,fp);功能:从指定的文件中读入一组数据。说明:1)buffer用于存放读入数据的缓冲区指针,即是存放数据的起始地址。2)size是读入的每个数据项的字节数。3)count是指要读入多少个size字节的数据项数,因此字节总数为count*size。4)fp是FILE类型的文件指针变量。文件的读写
#include"stdio.h"voidmain(){intiArray[5];/*定义数组*/inti;FILE*fp;/*定义文件指针*/fp=fopen("test.dat","rb");/*以读二进制文件的方法打开文件*/if(fp==NULL){printf("cannotopenthisfile\n");exit(0);}例10-6编写程序,从例10-5写入的文件test.dat中读取数据并显示在屏幕上。文件的读写
fread(iArray,4*5,1,fp);/*读取文件中5个整数存入数组*/for(i=0;i<5;i++)/*显示数字*/printf("%d\t",iArray[i]);fclose(fp);/*关闭文件*/}例10-6编写程序,从例10-5写入的文件test.dat中读取数据并显示在屏幕上。说明:1)fread(iArray,4*5,1,fp)读取文件test.dat中的4*5字节的数据,存入到数组iArray[]中,即从地址iArray[]开始的一段连续空间。2)使用fread()函数读取文件中的n个整数时,可以一次性读取,也可以逐个元素读取。逐个元素读取时,可以用循环语句实现,代码如下。for(i=0;i<5;i++)fread(&iArray[i],4,1,fp);文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。3.文本文件的格式化读写文件的格式化输入/输出函数fscanf()/fprintf(),与前面介绍的scanf()/printf()函数的作用类似,都是用来实现格式化读写操作,不同的是fscanf()/fprintf()的读写对象是磁盘文件,而不是屏幕。(1)格式化写函数fprintf()函数的一般形式如下:intfprintf(FILE*fp,char*format[,argument,…])功能:按format规定的格式把数据写入文件指针fp所指文件中。其中format参数的含义与printf是相同的。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。3.文本文件的格式化读写(2)格式化读函数fscanf()函数的一般形式如下:intfscanf(FILE*fp,char*format[,argument,…])功能:从文件指针fp所指文件中按format规定的格式把数据读入参数argument中。其中format参数的含义与scanf是相同的。文件的读写
#include<stdio.h>#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){load();save();display();}例10-7将4个学生的数据,从磁盘文件stu_dat调入,然后输出到stu_list文件中,并在屏幕上显示磁盘文件的内容。voidload(){FILE*fp;inti;if((fp=fopen("d:\\stu_dat","rb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fread(&stud[i],sizeof(structstudent_type),1,fp)!=1){if(feof(fp)){fclose(fp);retun;}printf("filereaderror\n");}fclose(fp);}文件的读写
voidsave(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)printf("filewriteerror\n");fclose(fp);}例10-7将4个学生的数据,从磁盘文件stu_dat调入,然后输出到stu_list文件中,并在屏幕上显示磁盘文件的内容。voiddisplay(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","r"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++){fscanf(fp,"%s%d%d%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);}文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。4.其他读写函数(1)putw()和getw()函数1)格式putw(intw,FILE*fp)getw(FILE*fp)2)功能:以二进制形式,从磁盘文件读写一个int型的整数,4个字节。3)返回值:成功时返回所写的整数值;失败时返回值为EOF。例如:putw(10,fp);i=getw(fp);文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。4.其他读写函数(1)putw()和getw()函数(2)fgets和fputs函数1)格式:fgets(str,n,fp);(str字符数组,n-1个字符)fputs(字符串,fp);("\0"不输出)2)功能:从fp指向的文件读/写一个字符串。3)返回值:fgets()正常时返回字符串的首地址;出错或文件尾,NULL。fputs()正常时返回写入的最后一个字符;出错为EOF。文件的读写
#include<stdio.h>voidmain(){FILE*fp;charstring[81];if((fp=fopen("file.txt","w"))==NULL){printf("cann'topenfile");exit(0);}while(strlen(gets(string))>0){fputs(string,fp);例10-8从键盘读入字符串存入文件,再从文件读回显示。fputs("\n",fp);}fclose(fp);if((fp=fopen("file.txt","r"))==NULL){printf("cann'topenfile");exit(0);}while(fgets(string,81,fp)!=NULL)fputs(string,stdout);fclose(fp);}文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写文件中有一个位置指针,指向当前读写的位置。具体位置由文件打开方式确定。一般“r”、“w”指向文件头,“a”指向文件尾。当顺序读写一个文件时,每读写完一个数据单位(一个字符,或一个整数,或一个结构体变量)后,位置指针自动移向下一个数据单位位置,如果想改变这种顺序,就需要强制使位置指针指向指定的位置。在对文件读写操作时,往往不需要从头开始,只需对其中指定的内容进行读写操作,这时我们可以调用库函数来改变文件的读写位置,这种函数称为文件的定位函数,一般用rewind()和fseek()函数实现。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写文件的读写方式一般有两种:1)顺序读写:位置指针按字节位置顺序移动。2)随机读写:位置指针按需要移动到任意位置。(1)rewind()函数格式:rewind(fp);功能:将文件的读写位置指针重新移到文件的开头。说明:在实际应用中,若对某一文件进行多次读写操作后,需要重新读写该文件,可以采用关闭该文件再打开该文件的方法,而使用rewind()函数可以在不关闭文件的情况下将位置指针返回文件开头,达到重新读取文件的目的,显然效率要比前一种方法高。rewind()函数原型为:voidrewind(FILE*fp);文件的读写
#include<stdio.h>voidmain(){FILE*fp1,*fp2;fp1=fopen("c:\\tc\\user\\ch12_4.c","r");fp2=fopen("d:\\tc\\user\\ch12_41.c","w");while(!feof(fp1))putchar(getc(fp1));rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);}例10-9对一个磁盘文件进行显示和复制两次操作。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写(2)fseek()函数格式:fseek(fp,offset,origin);功能:把文件位置指针移动到指定的位置,以便从当前位置读写文件。说明:1)offset是个long类型的数据,叫位移量,是指从起始点“origin”,向前或向后移动的字节数。2)origin表示用三个符号常量(在stdio.h中定义)或0,1,2分别表示“文件开始”、“当前位置”、“文件末尾”。如下表所示。Origin文件位置值SEEK_SET文件开始0SEEK_CUR当前位置1SEEK_END文件末尾2文件的读写
#include<stdlid.h>#include<stdio.h>structstudent_type{charname[10];intnum;intage;charsex;}stud[10];voidmain(){FILE*fp;inti;if((fp=fopen("stud_dat","rb"))==NULL)例10-10文件内存有10个学生数据,将单数学生数据输入计算机并在屏幕上显示。
{printf("cannotopenfile\n");exit(0);}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent_type),0);fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);}fclose(fp);}文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写(3)ftell()函数格式:fell(fp);功能:返回当前文件指针fp的读写位置,并用相对文件头的位移量来表示。常用于保存当前文件指针位置。说明:1)该函数限于二进制文件,对ASCII文本文件往往会出错。2)ftell()函数返回值为-1L时,表示出错。例如:if((i=ftell(fp))==-1L)printf(“FILEerror\n”);文件的读写
#include"stdio.h"main(){FILE*fp;charfilename[80];longlength;gets(filename);fp=fopen(filename,"rb");if(fp==NULL)printf("filenotfound!\n");else{fseek(fp,0L,SEEK_END);length=ftell(fp);printf("LengthofFileis%1dbytes\n",length);fclose(fp);}}例10-11求文件长度。
文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写(4)feof()函数格式:feof(文件指针);功能:用于检查文件是否结束,如果是,返回1;否则返回0。说明:1)对于文本文件,“EOF”为文件结束标记(因为EOF的值等于-1,而字符的ASCII码不可能出现-1)。2)“EOF”不能作为二进制文件结束标记(因为EOF的值等于-1,二进制文件的数据可以是-1)。所以ANSIC提供feof()函数来判定文件是否结束。例如,如果把一个指定的二进制文件磁盘文件从头到尾按顺序读出并在屏幕上显示出来,可用下程序段实现:while(!feof(fp))putchar(fgetc(fp));3)feof()函数同样适合于文本文件。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写(5)ferror()函数格式:ferror(文件指针);功能:检查文件在使用各种输入输出函数进行读写时是否出错。若出错,则文件就会产生错误标志。说明:1)每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试。2)fopen打开文件时,ferror函数初值自动置为0。文件的读写
在内存中,每个内存单元都有一个地址,如在一个32位计算机的内存中,内存地址的编号按十六进制从00000000-FFFFFFFF,共有232个内存单元(字节),如果一个整型变量占据4个字节,那么4个字节中编号最小的字节的地址即是该整型变量所占存储单元的地址。通常我们把指向内存存储单元的地址叫指针。5.文件的定位与随机读写(6)clearerr()函数格式:clearerr(文件指针);功能:使文件错误标志置为0,无返值。说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数。文件的读写
#include<stdio.h>intmain(void){FILE*stream;stream=fopen("DUMMY.FIL","w");getc(stream);if(ferror(stream)){printf("ErrorreadingfromDUMMY.FIL\n");clearerr(stream);}if(!ferror(stream))printf("Errorindicatorcleared!");fclose(stream);return0;}例10-12ferror()与clearerr()举例。
学生成绩管理系统的数据存取
intfnWriteFile(char*Filename,char*rw,PSTUDENTs,intm){inti;FILE*fp;PSTUDENTstu=s;if((fp=fopen(Filename,rw))==NULL){ printf("\n\t\t打开文件%s\n",Filename); return0;}
1.添加文件存储函数改进学生成绩管理系统,将存储在结构数组中的数据写入到文件data中去。参考代码如下:
for(i=0;i<m;i++)if(fwrite(stu++,LEN,1,fp)!=1){printf(“%s文件存盘失败!\n",Filename);getch();}fclose(fp);return1;}
学生成绩管理系统的数据存取
intfnReadFile(char*Filename,char*rw,PSTUDENTs,int*m){FILE*fp;PSTUDENTstu=s;if((fp=fopen(Filename,rw))==NULL){printf("\n\t\t打开文件%s失败\n",Filename);return0;}
2.添加文件装入函数与文件存储相反,文件装入就是把磁盘文件读入结构数组以便进一步的数据处理。考虑到函数模块的一般性,将文件名、存储的结构数组,以及记录总数均作为函数的形参。参考代码如下:
*m=0;while(!feof(fp))if(fread(stu++,LEN,1,fp)==1){*m=*m+1;}/*统计当前记录条数*/fclose(fp);return1;}
学生成绩管理系统的数据存取
…//省略intfnReadFile(char*Filename,char*rw,PSTUDENTs,int*m);intfnWriteFile(char*Filename,char*rw,PSTUDENTs,intm);intm; //m是记录的条数voidmain() {intn=1;structstudents[50]; //定义结构体数组do{fnMenuShow();//显示菜单界面fnReadFile("data","ab+",s,&m); //读数据scanf("%d",&n); //输入选择功能的编号system("cls");
3.修改主函数实现数据存取添加调用文件存储和装入函数语句。参考代码如下:
{switch(n){case1:fnDataInput(s);break;case2:fnSearch(s);break;case3:fnDel(s);break;case4:fnModify(s);break;case5:fnInsert(s);break;case6:fnSort(s);break;case7:fnTotal(s);break;case8: fnScoreShow(s);break;default:break;}fnWriteFile("data","wb",s,m);//写数据getch();}while(n);printf("\n\n\t\t谢谢您的使用!\n\t\t");}
拓展案例案例10-1写出下面问题的算法问题描述从键盘输入5个手机的信息(商标名、价格、颜色),然后保存在文件“phone.dat”中。拓展案例
#include"stdio.h"structtype_phone{charchBrand[10];floatfPrice;charchColor[10];};voidmain(){structtype_phonestPhone[5];FILE*filePointer;inti;filePointer=fopen("Phone.dat","wb");if(filePointer==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<5;i++){printf("pleaseinputthebrandname,price,color:");scanf("%s%f%s",stPhone[i].chBrand,&stPhone[i].fPrice,&stPhone[i].chColor);fwrite(&stPhone[i],sizeof(structtype_phone),1,filePointer);}fclose(filePointer);getch();}拓展案例案例10-2写出下面问题的算法问题描述将文件“phone.dat”中的第1、3、5条记录读出,并给每条记录的价格加上100元,然后将这三条记录输出在屏幕上(注意每条信息输出为一行)。拓展案例
#include"stdio.h"#include"stdio.h"structtype_phone{charchBrand[10];floatfPrice;charchColor[10];};voidmain(){structtype_phonestPhone[3];FILE*filePointer;inti;filePointer=fopen("Phone.dat","rb");if(filePointer==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<3;i++){fseek(filePointer,2*sizeof(structtype_phone),SEEK_SET);fread(stPhone[i],sizeof(structtype_phone),1,filePointer);stPhone.fPrice+=100;}fclose(filePointer);printf("BrnadNamePriceColor\n");for(i=0;i<3;i++){printf("%s\tt%f\t%s\n",stPhone[i].chBrand,stPhone[i].fPrice,stPhone[i].chColor);}getch();}
拓展活动观看央视新闻推出的八集系列节目--《大国工匠》。在IT行业,有很多的人在自己的岗位上刻苦钻研,创新创造。作为新时代IT青年,学习程序设计,更需要大国工匠的“精雕细琢、精益求精”的工匠精神,从而使得软件实现所
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床护理中的人文关怀
- 沪科黔科版《综合实践活动》5上海豚小档案 课件
- 基础管理学教育课件
- 高二下学期教学计划集合八篇
- 企业职工辞职报告模板7篇
- 月末工作总结4篇
- 员工安全承诺书模板集锦八篇
- 美术教师学年教学计划5篇
- 地质工作个人总结
- 母亲节系列活动方案五篇
- 行政管理学(山东联盟)智慧树知到答案2024年曲阜师范大学
- 03“探界者”钟扬(同步教案)-2024-2025学年中职高二语文新教材同步教学讲堂(高教版2023·职业模块)
- 安徽省2022年中考语文现代文阅读真题及答案
- 《 唐代二十四节气诗研究》范文
- 北师大版八年级数学上册专题7.7平行线中的四大经典模型同步练习(学生版+解析)
- 2024年新苏教版科学六年级上册全册背诵专用知识点
- 电机扭矩与丝杆推力关系(自动计算)
- AQ 1066-2008 煤层瓦斯含量井下直接测定方法(正式版)
- 幕墙预埋件合同范本
- 电梯安全总监和安全员的任命文件
- SL-T+62-2020水工建筑物水泥灌浆施工技术规范
评论
0/150
提交评论