1 / 26

实验十 文件编程

实验十 文件编程. 一、实验目的. 掌握文件及文件指针的概念; 掌握常用文件函数的使用; 掌握文件定位函数的使用. 二、实验内容. 以下程序中存在一些错误,请调试纠正。 在 D 盘的根目录下建立一个名为 exam1.txt 的简单顺序存取文件。程序的功能是从键盘读入一串字符,以 “ # ” 结束,将键入的字符存入磁盘文件。程序如下:. #include <stdio.h> #include <stdlib.h> main() { char ch; FILE *fp;

nikita
Download Presentation

实验十 文件编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 实验十 文件编程

  2. 一、实验目的 • 掌握文件及文件指针的概念; • 掌握常用文件函数的使用; • 掌握文件定位函数的使用

  3. 二、实验内容 • 以下程序中存在一些错误,请调试纠正。 在D盘的根目录下建立一个名为exam1.txt的简单顺序存取文件。程序的功能是从键盘读入一串字符,以“#”结束,将键入的字符存入磁盘文件。程序如下:

  4. #include <stdio.h> • #include <stdlib.h> • main() • { • char ch; • FILE *fp; • if((fp=fopen("d:exmp1.txt","w"))==NULL) • { • printf("Cannot open file\n"); • exit(0); • } • printf("Pleae input string:,#结束\n"); • ch=getchar(); • while(ch!='#') • { • fputc(fp); • putchar(ch); • ch=getchar(); • } • fclose(fp); • return 0; • }

  5. 在fopen("d:exmp1.txt","w")中,"w"表示打开文本文件用于输出。如果将这个参数换成"r",则表示打开文本文件用于输入,换成"wb",则表示打开二进制文件用于输出,换成"rb",则表示打开二进制文件用于输入。在fopen("d:exmp1.txt","w")中,"w"表示打开文本文件用于输出。如果将这个参数换成"r",则表示打开文本文件用于输入,换成"wb",则表示打开二进制文件用于输出,换成"rb",则表示打开二进制文件用于输入。

  6. 2.程序填空 • 1) 以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件尾部,然后调用ftell函数给出文件位置指针,从而确定文件长度。请在空白处填上适当的语句。 • FILE *myf; • long f1; • myf= 1 ("test.dat","rb"); • fseek(myf); • f1=ftell(myf); • fclose(myf); • printf("%d\n",f1);

  7. 2) 以下函数是将5个学生的信息以二进制方式存放在文件名为student.dat的文件中。请在空白处填上适当的语句。 • #include <stdio.h> • #define size 5 • struct student • { • long num; • char name[8]; • int age; • }stu[size]; • void fsave() • { • FILE *f1; • f1=fopen("student.dat", 2 )) • for(int i=0;i>size;i++) • { • if(fwrite(&stu[i], 3 ,1,f1)) • printf("File write error!\n"); • } • 4 ; • }

  8. 3. 文件操作 • 文件打开函数fopen • fopen函数用来打开一个文件,其调用的一般形式为: • 文件指针名 = fopen(文件名,使用文件方式) • 例如,在当前目录下打开文件file a, 只允许进行“读”操作,并使fp指向该文件,代码如下: • FILE *fp; • fp=("file a","r"); • 又如: • FILE *fphzk; • fphzk=("c:\\hzk16',"rb");

  9. 其意义是打开C驱动器磁盘的根目录下的文件hzk16, 这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜杠“\\ ”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下面给出了它们的符号和意义。

  10. 文件使用方式        意 义 • “rt”    只读打开一个文本文件,只允许读数据 • “wt”    只写打开或建立一个文本文件,只允许写数据 • “at”    追加打开一个文本文件,并在文件末尾写数据 • “rb”    只读打开一个二进制文件,只允许读数据 • “wb”    只写打开或建立一个二进制文件,只允许写数据 • “ab”    追加打开一个二进制文件,并在文件末尾写数据 • “rt+”    读写打开一个文本文件,允许读和写 • “wt+”   读写打开或建立一个文本文件,允许读写 • “at+”    读写打开一个文本文件,允许读,或在文件末追加数据 • “rb+”   读写打开一个二进制文件,允许读和写 • “wb+”   读写打开或建立一个二进制文件,允许读和写 • “ab+”  读写打开一个二进制文件,允许读,或在文件末追加数据

  11. 对于文件使用方式有以下几点说明:1. 文件使用方式由r,w,a,t,b,十六个字符拼成,各字符的含义是: • r(read): 读 • w(write): 写 • a(append): 追加 • t(text): 文本文件,可省略不写 • b(banary): 二进制文件 • +: 读和写

  12. 2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。 • 3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 • 4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。 • 5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:

  13. if ((fp = fopen("c:\\hzk16","rb") == NULL) • { • printf("\nerror on open c:\\hzk16 file!"); • getch(); • exit(1); • }

  14. 这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待, 只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。

  15. 文件关闭函数fclose • 调用的一般形式是: • fclose(文件指针); • 例如: • fclose(fp); • 正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。文件的读写对文件的读和写是最常用的文件操作。

  16. 文件的随机读写 • 在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个,即 rewind 函数和fseek函数。 • rewind函数的调用形式为: • rewind(文件指针); • 它的功能是把文件内部的位置指针移到文件首。

  17. fseek函数用来移动文件内部位置指针,其调用形式为: • fseek(文件指针,位移量,起始点); • 其中:“文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。

  18. 其表示方法如下表 • 起始点    表示符号    数字表示 • ───────────────────── • 文件首    SEEK—SET0 • 当前位置   SEEK—CUR1 • 文件末尾   SEEK—END 2

  19. 另外还有一个有用的函数是ftell。其功能是返回文件读写位置到文件首字节的字节数。文件打开,未读写前调用此函数时,其返回值为0。出错(如文件不存在)时返回-1。另外还有一个有用的函数是ftell。其功能是返回文件读写位置到文件首字节的字节数。文件打开,未读写前调用此函数时,其返回值为0。出错(如文件不存在)时返回-1。 • 函数原型: • Long ftell (FILE *fp);

  20. 例1. 下面用例题来说明文件的随机读写。 /*在学生文件stu list中读出第二个学生的数据。*/ • #include<stdio.h> • struct stu • { • char name[10]; • int num; • int age; • char addr[15]; • }boy,*qq;

  21. int main(void) • { • FILE *fp; • char ch; • int i=1; • qq=&boy; • if((fp=fopen("stu_list","rb"))==NULL) • { • printf("Cannot open file, strike any key to exit!"); • getch(); • exit(1); • } • rewind(fp); • fseek(fp,i*sizeof(struct stu),0); • fread(qq,sizeof(struct stu),1,fp); • printf("\n\nname\tnumber age addr\n"); • printf("%s\t%5d %7d %s\n", qq->name, qq->num, qq->age, qq->addr); • }

  22. 文件结束检测函数feof函数调用格式: • feof(文件指针); • 功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。

  23. 三、实验内容 • 1.编写一个函数,使之输入10条学生记录,保存在文件中,其中学生采用结构student; • struct student • { • long int number; • char name[8]; • float score; • };

  24. WriteRec()和ReadRec()的参考程序如下: • void WriteRec() • { • student stud; • FILE *fp; • if((fp=fopen("d:\\exmp1.txt","wb"))==null) • { • printf("Cannot open file\n"); • exit(0); • } • for(i=0;i<10;i++) • { • scanf("%ld",&stud.number); • scanf("%s",stud.name); • scanf("%f",&stud.score); • if(fwrite(&stud,sizeof(stud),1,fp)) • { • printf("File write error\n"); • } • } • fclose(fp); • }

  25. void ReadRec() • { • student stud; • FILE *fp; • if((fp=fopen("d:\\exmp1.txt","rb"))==null) • { • printf("Cannot open file\n"); • exit(0); • } • while(!feof(fp)) • { • fread(&st1,sizeof(st1),1,fp); • printf(“学号:%ld 姓名:%s 总分: • %f\n",stud.number,stud.name,stud.score); • fseek(fp,sizeof(stud),1); • } • fclose(fp); • }

  26. 利用WriteRec( )和ReadRec( )函数,编写主程序,实现顺序输入10个记录,写到文件中,再从文件中读取数据,然后将输出显示到屏幕上。 • 2.求1000以内的所有素数,并将它们写入一个指定的文本文件“d:\mysele.dat”中。 • 3.文本文件a1.txt和a2.txt中包含若干从小到大排过序的整数,要求把两个文件中的数据合起来,仍然按照从小到大的顺序写入文件a3.txt中,试编写相应的程序。

More Related