C语言_ch10_1_顺序读写文件_第1页
C语言_ch10_1_顺序读写文件_第2页
C语言_ch10_1_顺序读写文件_第3页
C语言_ch10_1_顺序读写文件_第4页
C语言_ch10_1_顺序读写文件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/8/5,1,上一节我们学到了,共用体 枚举,2020/8/5,2,第10章 文件,10.1文件概述 10.2文件的打开与关闭 10.3顺序读写数据文件 10.4随机读写数据文件 10.5文件读写的出错检测,2020/8/5,3,为什么要使用文件? 断电后数据不丢失 操作系统以文件为单位进行管理 在使用文件之前需要了解 文件名 目录结构 文件分类,10.1C文件概述,4,10.1.2 文件名,D: CCtempfile1.dat,文件路径,文件名主干,文件后缀,2020/8/5,5,绝对路径和相对路径,绝对路径(Absolute Path) 完整的描述文件位置的路径就是绝对路径 D:V

2、CProjectssamplemain.cpp 相对路径(Relative Path) 为什么要使用相对路径?可移植性 相对于什么? 相对于当前路径 如果当前路径是: D:VCProjects 则: samplemain.cpp ./ 表示上一级目录,2020/8/5,6,10.1.3 文件分类,根据数据的组织形式, 文件可分为: 二进制文件(Binary File) ASCII文件,2020/8/5,7,BMP文件 头部是固定长度的文件头信息 2个字节:用来记录文件为BMP格式 8个字节:文件长度 4个字节:bmp文件头的长度 ,二进制文件(Binary File),2020/8/5,8,1

3、0000在内存中的存储形式,二进制文件,文本文件,2020/8/5,9,ASCII文件,又称文本(text)文件 每个字符用一个字节的ASCII代码存放 如果有一个整数10000, 占5个字节 所有内容都是可打印字符, .c .txt .h .htm,2020/8/5,10,二进制文件 vs ASCII文件,二进制文件的优缺点 优点:存取快,无需转换 缺点:便于对字符进行逐个处理 ASCII文件 优点:便于对字符进行逐个处理,便于输出字符 缺点:一般占存储空间较多, 而且要花费转换时间,2020/8/5,11,10.1.4 文件缓冲区,ANSI C标准采用缓冲文件系统处理数据文件 所谓缓冲文件

4、系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区,文件缓冲区,从内存向磁盘输出数据,2020/8/5,12,程序数据区,输出文件缓冲区,输入文件缓冲区,磁盘,装满缓冲区,文件缓冲区,从磁盘向计算机读入数据,2020/8/5,13,程序数据区,输出文件缓冲区,输入文件缓冲区,磁盘,充满缓冲区,10.1.5文件类型指针,2020/8/5,14,每个文件的相关信息(如文件名、文件状态及文件当前位置等)保存在一个由系统定义的FILE结构体变量中。 在stdio.h文件中有以下的文件类型声明:,2020/8/5,15,typedef struct short level; /缓冲

5、区满或空的程度 unsigned flags; /文件状态标志 char fd; /文件描述符 unsigned char hold; /如无缓冲区不读取字符 short bsize; /缓冲区的大小 unsigned char *baffer;/数据缓冲区的位置 unsigned char *curp; /指针当前的指向 unsigned istemp; /临时文件指示器 short token; /用于有效性检查 FILE;,2020/8/5,16,我们需要通过文件指针来访问其指向的文件 FILE *fp;,2020/8/5,17,10.2文件的打开与关闭,先打开,再读写,最后应关闭 所谓

6、打开是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。 所谓关闭是指撤销文件信息区和文件缓冲区 10.2.1用fopen函数打开文件 10.2.2用fclose函数关闭文件,2020/8/5,18,10.2.1用fopen函数打开文件,fopen函数的调用方式通常为: FILE *fp; fp = fopen(文件名, 使用文件方式); if (NULL = (fp = fopen(file1, r) printf(cannot open filen); exit(0); ,文件使用方式,使用文件方式参见教材P335 表10.1 r - open

7、for reading(file must exist) w - open empty file for writing (file need not exist) a - open for appending (file need not exist) r+ - open for reading and writing, start at beginning(file must exist) w+ - open empty file for reading and writing (overwrite file) a+ - open for reading and writing (appe

8、nd if file exists),2020/8/5,19,说明,(1) w方式 如果原来文件不存在,则建立一个新的空文件。 如果原来文件已存在,则在先删除该文件,然后重新建立一个新的空文件。 (2) 试图读取一个无读取权限的文件, 也会发生错误, fopen将返回NULL (3) 在程序开始运行时, 系统自动打开3个标准文件:标准输入、标准输出、标准出错输出,并且用3个文件指针stdin、stdout和stderr分别指向。,2020/8/5,20,(4) C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上 文本方式写时,每一个n(0A换行符),转换成rn(0D0A,回车换行),

9、然后再写入; 文本方式读时,每一个rn将其反变化为n,然后再读出 二进制读写时,不存在任何转换 (5)b,即bt,默认以文本形式;rb,以二进制形式,2020/8/5,21,10.2.2文件的关闭(fclose函数),应该养成在程序终止之前关闭所有文件的习惯, 如果不关闭文件将会丢失数据。为什么? 因为, 在向文件写数据时, 是先将数据输到缓冲区, 待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行, 就会将缓冲区中的数据丢失。用fclose函数关闭文件, 可以避免这个问题, 它先把缓冲区中的数据输出到磁盘文件, 然后才释放文件指针变量。 fclose函数调用的一般形式为:f

10、close(文件指针); 例如:fclose(fp); 关闭操作执行正确, 返回0;否则返回EOF(-1)。,2020/8/5,22,2020/8/5,23,10.3文件的顺序读写,10.3.1 怎样向文件读写字符 10.3.2 怎样向文件读写字符串 10.3.3 用格式化的方式读写文件 10.3.4 用二进制方式向文件读写一组数据,2020/8/5,24,10.3.1 向文件读写字符,EOF是在stdio.h文件中定义的符号常量, 值为-1,fputc和fgetc函数举例,例10.1 从键盘输入一些字符, 逐个把它们送到文件中去, 直到输入一个#为止。 int main() FILE *fp

11、; char ch,filename20; printf(请输入文件名:); scanf(%s,filename); if (NULL = (fp=fopen(filename,w) printf(cannot open filen); exit(1); ,25,2020/8/5,26,ch = getchar(); /接收在执行scanf语句时最后输入的回车符 / fflush(stdin); / 也可 printf(请输入一个字符串(以#结束):); ch = getchar();/接收输入的第一个字符 while (ch != #) fputc(ch, fp); ch = getchar

12、(); fclose(fp); return 0; ,2020/8/5,27,例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。 解题思路:从file1.dat文件中逐个读入字符,然后逐个输出到file2.dat中。,2020/8/5,28,#include #include int main() FILE *from, *to; char ch, fromfilename20, tofilename20; / 打开源文件 printf(输入源文件的名字:); scanf(%s, fromfil

13、ename); if (from=fopen(fromfilename, r) = NULL) printf(无法打开源文件n); exit(0); / 打开目标文件 printf(输入目标文件的名字:); scanf(%s, tofilename); if (to=fopen(tofilename, w) = NULL) printf(无法打开目标文件n); exit(0); ,2020/8/5,29,/ 从源文件中逐个读取字符,写入到目标文件中,并显示 while (!feof(in) ch = fgetc(in); fputc(ch, out); putchar(ch); putchar

14、(10); /换行符 fclose(in); fclose(out); return 0; ,检查当前读写位置是否移到文件末尾,也可以用此程序来复制一个二进制文件, 只需将两个fopen函数中的r和w分别改为rb和wb即可。 也可以在输入命令行时把两个文件名一起输入。这时要用到main函数的参数。程序改为,2020/8/5,30,2020/8/5,31,int main(int argc, char*argv) FILE *from, *to; if (argc!=3) printf(You forgot to enter a filenamen); exit(1); if (from=fop

15、en(argv1, r)=NULL) printf(cannot open fromfilen); exit(1); if (to=fopen(argv2, w)=NULL) printf(cannot open tofilen); exit(1); ,2020/8/5,32,while (!feof(from) fputc(fgetc(from), to); fclose(from); fclose(to); ,2020/8/5,33,10.3.2 向文件读写字符串,2020/8/5,34,fgets函数,函数原型为: char *fgets (char *str, int n, FILE

16、*fp); 其作用是从fp所指向的文件读入n-1个字符,自动在最后加一个0字符,放到字符数组str中。 如果在读完n-1个字符之前遇到换行符n或文件结束符EOF,读入即结束,但将所遇到的换行符n也作为一个字符读入 执行成功,返回str数组首地址,如果一开始就遇到文件尾或读数据错,返回NULL,2020/8/5,35,fputs函数,函数原型: int fputs (char *str, FILE *fp); str指向的字符串输出到fp所指向的文件中 调用语句例: fputs(China, fp); fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针 字符串末尾的0不输出 输出

17、成功,返回非0;失败,返回EOF,2020/8/5,36,例10.3,例10.3 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。,37,int main() FILE *fp; char str310, temp10; int i, j, k, n=3; printf(Enter strings:n); for (i=0; i 0) k = j; if (k != i) strcpy(temp, stri); strcpy(stri, strk); strcpy(strk, temp); ,2020/8/5,38,if (fp=fopen(stri

18、ng.dat, w) = NULL) printf(cant open file!n); exit(1); printf(nThe new sequence:n); for (i=0; in; i+) fputs(stri, fp); fputs(n, fp); printf(%sn, stri); return 0; ,2020/8/5,39,思考: 从文件string.dat中读回字符串,并在屏幕上显示,应如何编写程序?,2020/8/5,40,#include #include int main() FILE *fp; char str50; if (fp=fopen(D:CCstrin

19、g.dat, r) = NULL) printf(cant open file!n); exit(1); while (fgets(str,50,fp) != NULL) puts(str); fclose (fp); return 0; ,2020/8/5,41,10.3.3用格式化的方式读写文件,fprintf(文件指针,格式字符串,输出表列); fscanf (文件指针,格式字符串,输入表列); 如: fprintf (fp,%d,%6.2f, i, f); fscanf (fp,%d,%f, ,2020/8/5,42,/* fprintf example */ #include int

20、 main() FILE * pFile; int n; char name100; pFile = fopen(myfile.txt,w); for (n=0 ; n3 ; n+) puts (please, enter a name: ); gets (name); fprintf (pFile, Name %d %-10.10sn,n,name); fclose (pFile); return 0; ,43,/* fscanf example */ #include int main() char str80; float f; FILE *pFile; pFile = fopen (m

21、yfile.txt,w+); fprintf(pFile, %f %s, 3.1416, PI); rewind(pFile); fscanf(pFile, %f, ,10.3.4 二进制方式读写,常常要求一次读入一组数据(如一个结构体变量的值), ANSI C标准提出设置两个函数(fread和fwrite), 用来读写一个数据块。 fread和fwrite函数一般用于二进制文件的输入输出。,2020/8/5,44,2020/8/5,45,fread函数读取数据块,size_t fread ( void *ptr, size_t size, size_t count, FILE * strea

22、m ); buffer:是一个指针。 读入数据的存放地址。 size:要读写的每一项的字节数。 count:要读写多少个数据项。 fp:FILE型指针。 调用成功返回count的值。,2020/8/5,46,fwrite函数写入数据块,size_t fwrite ( const void *ptr, size_t size, size_t count, FILE *stream ); buffer:是一个指针。 把此地址开始的存储区中的数据向文件输出。 size:要读写的每一项的字节数。 count:要读写多少个数据项。 fp:FILE型指针。 调用成功返回count的值。,2020/8/5,

23、47,如果文件以二进制形式打开, 用fread和fwrite函数就可以读写任何类型的信息, 如: fread(farray, 4, 2, fp); 其中farray是一个实型数组名。一个实型变量占4个字节。 这个函数从fp所指向的文件读入2次(每次4个字节)数据, 存储到数组farray中。,2020/8/5,48,如果有一个如下的结构体类型: #define SIZE 10 struct student char name10; int num; int age; char addr15; studSIZE;,2020/8/5,49,例10.4,例10.4 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。 解题思路: 定义有10个元素的结构体数组,用来存放10个学生的数据 从main函数输入10个学生的数据 用save函数实现向磁盘输出学生数据 用fwrite函数一次输出一个学生的数据,2020/8/5,50,例10.4从键盘输入4个学生的有关数据, 然后把它们转存到磁盘文件上去。 void save() FILE *fp; int i; if (fp=fopen(stu.dat, wb)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论