1 / 28

C 语言程序设计

C 语言程序设计. 第十三章 文件. 内容简介: 之前我们学习输入输出,都是以终端为对象,也就是从键盘输入数据,运行的结果显示在终端,也就是显示器上。 本章的知识是从操作系统的角度看的,也就是键盘输入就是一个输入文件,显示器的显示就是输出文件。. I/O 设备. 输入设备 键盘、鼠标 软盘、硬盘、光驱(以文件的形式) 串行口、并行口、 USB 接口、网络端口 扫描仪、视频采集卡、电视卡、游戏杆、话筒 …… 输出设备 显示器、打印机 软盘、硬盘、 CD-R/DVD-R (以文件的形式) 串行口、并行口、 USB 接口、网络端口 音箱 ……

Download Presentation

C 语言程序设计

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. C语言程序设计

  2. 第十三章 文件 内容简介: 之前我们学习输入输出,都是以终端为对象,也就是从键盘输入数据,运行的结果显示在终端,也就是显示器上。 本章的知识是从操作系统的角度看的,也就是键盘输入就是一个输入文件,显示器的显示就是输出文件。

  3. I/O设备 • 输入设备 • 键盘、鼠标 • 软盘、硬盘、光驱(以文件的形式) • 串行口、并行口、USB接口、网络端口 • 扫描仪、视频采集卡、电视卡、游戏杆、话筒 • …… • 输出设备 • 显示器、打印机 • 软盘、硬盘、CD-R/DVD-R(以文件的形式) • 串行口、并行口、USB接口、网络端口 • 音箱 • …… • 单纯的输入设备或者单纯的输出设备越来越少

  4. 标准输入输出 • 字符界面的操作系统一般都提供标准输入与输出设备 • DOS、Linux、Unix…… • 一般情况,标准输入就是键盘,标准输出就是终端显示器 • 操作系统有能力重定向标准输入与输出,比如让文件作为标准输入,打印机作为标准输出 • 这种重定向程序本身是感觉不到的 自来水厂

  5. 流(Stream) • 水流 • “子在川上曰:逝者如斯夫” • 计算机中的流的概念 • 一般称为数据流,也有叫做字节流、比特流的,还有很具体的文件流、视频流、音频流等 • 时光不能倒流,但计算机中的很多流都是会倒流的 • 如果你想重新读已经读过的数据,或者要修改已经写入的数据,可以发出流控(Flow Control)命令 • 不会倒流的数据流也很多,例如网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,没有大量存储的能力

  6. 文件(File)的概念 • 计算机的内存容易健忘,所以数据必须保存在硬盘、软盘、光盘和磁带等“不健忘”的外存上 • 这些能大量、永久保存信息的媒介,一般都以文件的形式给用户及应用程序使用 • 文件 • 一般指存储在外部介质上具有名字(文件名)的一组相关数据的集合 • 用文件可长期保存数据,并实现数据共享 • 程序中的文件 • 在程序运行时由程序在磁盘上建立一个文件,并通过写操作将数据存入该文件;或由程序打开磁盘上的某个已有文件,并通过读操作将文件中的数据读入内存供程序使用

  7. 文件与流 • 在C语言中,文件可以是磁盘文件、终端显示器或打印机等等。 • 程序通过打开操作把流与设备联系起来,文件打开后,可以在程序和文件之间交换数据。 • 程序通过关闭操作断开流与文件的联系。 • 所有流的性质都一样。因为流与设备无关,所以能写入磁盘文件的同一函数也能写入另一设备,如控制台终端等。 • 但文件的能力则可能不同。例如,磁盘文件可以支持随机存取,而键盘则不行。

  8. 文件的存放 • 可以建立若干目录(文件夹),在目录里保存文件,同一级目录里保存的文件不能同名。 • 对使用者而言,只要知道文件的路径(全目录)和文件名,就能使用该文件 • C:\home\Sunner\main.c • 这都是托OS的福

  9. 文件的访问 • 文件访问的基本模式 • open:打开文件,获得对此文件的指针、引用和句柄等,以证明可以使用此文件 • read:读文件。参数一般指明要读多少字节,读到哪块内存。每次调用此功能,都是接着上次调用的结束位置读。(所以是个输入流) • write:写文件。参数一般指明把哪块内存的内容写入文件,要写多少字节。每次调用此功能,都是接着上次调用的结束位置写。(所以是个输出流) • close:关闭文件,表明操作结束,不再使用此文件。文件使用完毕必须关闭,否则影响系统性能 • seek:随机控制流的当前位置,文件定位

  10. C语言中的文件访问 • 下面介绍的函数均定义在<io.h>和<fcntl.h>中 • int open(const char *pathname, int access); • int fd = open("C:\\CONFIG.SYS", O_RDWR | O_CREAT); • pathname是文件名,包含路径。如果不含路径,表示打开当前目录下的文件 • access是打开方式,常用为O_RDONLY、O_WRONLY、O_RDWR与O_CREAT、O_TRUNC、O_APPEND的或运算 • 返回值为文件句柄(File Handle) ,留待以后使用。如果打开失败,返回值为-1

  11. C语言中的文件访问 • int read(int handle, void *buf, unsigned len); • int n_read = read(fd, buf, BUFSIZ); • handle是open获得的文件句柄 • buf是保存读入内容的内存指针 • len是最大可以读入的字节数 • 返回值为实际读入的字节数,可能大于len。返回0表示读到了末尾,返回-1表示出错

  12. C语言中的文件访问 • int write(int handle, const void *buf, unsigned len); • int n_write = write(fd, buf, BUFSIZ); • handle是open获得的文件句柄 • buf是要写入内容的内存指针 • len是写入多少字节 • 返回值为实际写入的字节数,可能小于len。返回-1表示出错

  13. C语言中的文件访问 • int close(int handle); • int ret = close(fd); • handle是open获得的文件句柄 • 关闭成功返回0,否则返回-1

  14. C语言独特的文件访问 • int fgetc(FILE *fp); • int fputc(int c, FILE *fp); • char *fgets(char *s, int n, FILE *fp); • int fputs(const char *s, FILE *fp); • int fscanf(FILE *fp, const char *format, ...); • int fprintf(FILE *fp, const char *format, ...);

  15. C语言独特的文件访问 • size_t fread(void *ptr, size_t size, size_t n, FILE *fp); • size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp); • int feof(FILE *fp); • int fseek(FILE *fp, long offset, int whence); • int fclose(FILE *fp);

  16. 文件的数据块的读写 fread和 fwrite函数 fwrite()函数的功能: 将内存中的一组数据写到fp所指向的文件中。 按照内存中的存储形式输出,为二进制文件。 fwrite(buff, size, count, fp) 指向写入文件的指针 所要写入文件的数据在内存中的起始地址 写入文件的数据项数 写入文件的每个数据项的字节数 函数调用成功返回count的值,否则返回-1。

  17. 例1:文件的数据块写的操作 从键盘输入n个同学 的学号,姓名和成绩存入文件。 #include “stdio.h” typedef struct student STUD; struct student { int num; char name[12]; int score; };

  18. fread()函数: 功能: 在fp所指向的文件中读取一组数据并将其放到内存中去。 fread(buff, size, count, fp) 指向待读文件的指针 待读文件的数据在内存中的起始地址 从文件读入的数据项数 从文件读入的每个数据项的字节数 函数调用成功返回count的值,否则返回-1。

  19. 例2:文件的数据块读的操作 #include “stdio.h” typedef struct student STUD; struct student { int num; char name[12]; int score; }; main() { STUD stu; FILE *fp; int i,n; char filename[12]; scanf(“%s”,filename); if((fp=fopen(filename, “rb”))==NULL) { printf(“can’t open the file!\n”); exit(0); }

  20. fread(&n,2,1,fp); printf(“n=%d”,n); for(i=0; i<n; i++) { if(fread( &stu, sizeof(STUD), 1, fp) != 1 ) /*读入一个*/ { printf(“file read error!”); exit(0); } printf(“%d\t%s\t%d\n”,stu.num, stu.name, stu.score); } fclose(fp); }

  21. main() { STUD stu[20]; …… fread(&n,2,1,fp); printf(“n=%d”,n); if(fread( stu, sizeof(STUD) , n , fp ) ! = n ) /*读入n个*/ { printf(“file read error!”); exit(0); } for(i=0; i<n; i++) printf(“%d\t%s\t%d\n”, stu[i].num, stu[i].name,stu[i].score); fclose(fp); }

  22. 文件的格式化读写(文本文件) • fprintf函数 格式:fprintf(fp,format,arg1,arg2,…,argn); 将输出项arg1,arg2…argn按指定format格式写入fp所指的文件中,即输出到磁盘文件; • fscanf函数 格式:fscanf(fp,format,&arg1,&arg2,…&argn); 按指定format格式从fp所指的文件中读取数据依次送入arg1,arg2…argn的内存单元; • fp: 为指向fopen函数打开的文件的指针 • format :为格式字符串 • arg1,arg2,…argn(&arg1,&arg2,…&argn)输出/输入项表列

  23. 例1:文件的格式化写操作 #include “stdio.h” typedef struct student STUD; struct student { int num; char name[12]; int score; }; main() { STUD stu; FILE *fp; int i,n; char filename[12]; scanf(“%s”,filename);

  24. if((fp=fopen(filename, “w”))==NULL) /*新建一个文件*/ { printf(“can’t open the file!\n”); exit(0); } scanf(“%d”,&n); fprintf(fp, “%4d”,n); for(i=0; i<n; i++) { scanf(“%d%s%d”,&stu.num, stu.name, &stu.score); fprintf(fp, “%6d%10s%3d”,stu.num, stu.name, stu.score); } fclose(fp); }

  25. 例2:文件的格式化读操作 #include “stdio.h” typedef struct student STUD; struct student { int num; char name[12]; int score; }; main() { STUD stu; FILE *fp; int i,n; char filename[12]; scanf(“%s”,filename);

  26. if((fp=fopen(filename, “r”))==NULL) /*新建一个文件*/ { printf(“can’t open the file!\n”); exit(0); } fscanf(fp,“%6d”,&n); printf(“n=\n”,n); for(i=0; i<n; i++) { fscanf(fp, “%6d%10s%3d”,&stu.num,stu.name,&stu.score); printf(“%d\t%s\t%d\n”,stu.num,stu.name,stu.score); } fclose(fp); }

  27. fseek()函数: 利用该函数可以改变文件指针的位置,从而实现随机读写 形式: fseek(fp,offset,from); • fp:为指向fopen函数打开的文件的指针; • offset:文件指针的位移量,字节数,long型,加l或L; • from:起始位置 0----文件开始 1-----当前位置 2-----文件末尾 • ftell()函数: 取得文件指针的当前位置,用字节数,long类型。

  28. 本章总结: 1、流、文件 2、文件的读、写访问方式 学习C语言贵在 勤思考多练习! “编程的道路还长着呢!”

More Related