- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计基础
2005.9
第十三讲 文件、算法初步
教学内容 硬盘与文件 • 文件的概念 • 文件操作函数fopen和fclose 文件的随机读写 • 定位函数frewind 和fseek 程序与算法 • 直接排序 • 冒泡排序
struct node *q,*p,*s; head a1 next
数据块读写函数fread和fwtrite
• • • •
读函数调用形式: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中: buffer:一个指针。在fread函数中表示存放输入数据的首地址。在fwrite函 数中表示存放输出数据的首地址; size:表示数据块的字节数; count:表示要读写的数据块块数; 例如: fread(array,4,5,fp); 从fp所指的文件中每次读4个字节(一个实数)送入实数组array中,连续读5 次,即读5个实数到array中。
项目2常 驻数据区
函数
数据
有限的 内存
项目2分配内存
内存单元用地址标记; 硬盘空间用扇区的簇号标记,没有地址的概念。 文件内部有一个偏移量i指示文件当前操作记录的下标位置。
流的概念
C语言I/O系统在程序员和物理设备之间提供了一个转换接口,或者说是一 层抽象的界面,我们称它为“流”。而具体的物理实现(包括物理设备 、物理存储)称之为文件。 所有的流具有相同的行为(输入/输出数据),用来进行磁盘文件写入的函 数也可以进行键盘、显示器等的读写操作,逻辑上相同,仅是物理层驱 动不同。
流 文件 键盘 物理驱动 显示器 磁盘 打印机
C语言中有两种类型的流: 文本流(text stream)。一个文本流由一行字符 组成,换行符表示一行结束。
I/O读写操作
二进制流(binary stream)。一个二进制流对应 写入到设备的内容,由字节序列组成,没 有字符翻译。
c语言中的流与 I/O设备
例1:块写入方式 struct stu { char name[10]; num[10]; }boya[2],boyb[2],*p=boya,*q=boyb; void main(void) 定义一个文件指针 两个结构数组指针初始指向boya和boyb { FILE *fp; char ch; int i; 如果打开文件失败 if((fp=fopen("f:\\stuList","wb+"))==NULL){ printf("Cannot open file strike any key exit!");exit(-1);} for(i=0;i<2;i++,p++){ printf("\ninput data(%d)\n",i+1); 从键盘输入数据 scanf("%s%s",p->name,p->num);} p=boya; 将p指向的结构数组元素, p指向一个结构数组 分2次写入到fp指向的文件, 每次长度是stu字节数。 fwrite(p,sizeof(struct stu),2,fp); rewind(fp); 调整fp,重新指向文件起始位置 fread(q,sizeof(struct stu),2,fp); printf("\n\nname\tnumber\n"); for(i=0;i<2;i++,q++)printf("%s\t%d\n",q->name,q->num); fclose(fp); 输出q指向的结构数 } 组元素到屏幕
链表操作—倒序
a2 next a3 next an ^ 倒序 head
^ a1
到达节点an之后,需 要做什么? q S
next a2
q=p; q p
next a3
p=s; p S s
next an
s=p->next;
head
a1 next
a2 next
p->next=q;
a3 next
p->next=q; s=p->next;
文件操作表
意义 文件打开方式 ―rt‖ ―wt‖ ―at‖ ―rb‖ ―wb‖ ―ab‖ ―rt+‖ ―wt+‖ ―at+‖ ―rb+‖ ―wb+‖ ―ab+‖ 只读打开一个文本文件,只允许读数据 只写打开或建立一个文本文件,只允许写数据 追加打开一个文本文件,并在文件末尾写数据 只读打开一个二进制文件,只允许读数据 只写打开或建立一个二进制文件,只允许写数据 追加打开一个二进制文件,并在文件末尾写数据 读写打开一个文本文件,允许读和写 读写打开或建立一个文本文件,允许读写 读写打开一个文本文件,允许读,或在文件末追加数据 读写打开一个二进制文件,允许读和写 读写打开或建立一个二进制文件,允许读和写 读写打开一个二进制文件,允许读,或在文件末追加数据
向fp指向的磁盘文件写入 一个整型数和字符
struct stu { char name[10], num[10]; }boya[2],boyb[2],*p=boya,*q=boyb; void main(void) 定义一个文件指针 两个结构数组指针初始指向boya和boyb { FILE *fp; char ch; int i; f盘根目录下读写打开或建立一个二进制文件,可读写 if((fp=fopen("f:\\stuLlist.dat","wb+"))==NULL){ printf("Cannot open file strike any key exit!"); getch();exit(-1);} for(i=0;i<2;i++,p++){ 如果打开文件失败 从键盘输入数据 printf("\ninput data\n"); scanf("%s%s",p->name,p->num); 将p指向的结构数组元素 } p指向一个结构数组 写入到fp指向的文件 p=boya; for(i=0;i<2;i++,p++)fprintf(fp,"%s %s\n",p->name,p->num); 将fp指向的文件 数据读出到q指 rewind(fp); 调整fp,重新指向文件起始位置 向的结构数组 for(i=0;i<2;i++,q++)fscanf(fp,"%s %s\n",q->name,q->num); printf("\n\nname\tnumber\n"); 输出q指向的结构数 组元素到屏幕 q=boyb; for(i=0;i<2;i++,q++)printf("%s\t%s\t\n",q->name,q->num); fclose(fp); }
当前操 作位置i 当前操 作位置 当前操i 作位置 当前操i 作位置i
fp
文件
纪录在磁盘 上顺序排列
文件打开函数fopen()
• • • fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(―文件名.扩展名”,‖打开文件方式”); 其中: 文件指针名必须是被说明为FILE 类型的指针变量; 文件名是被打开文件的文件名,扩展名是文件类型说明,可以省略; 打开文件方式是指文件流的类型和读写操作以及新建还是追加在文件尾部 要求。 读一个文件,意味 例如: 着它已经存在 FILE *fp; fp=("filea","r"); 在当前目录下打开文件filea,“读”操作,并使fp指向该文件。 又如: FILE *fp; fp=fopen("c:\\hzk16","wb+"); 打开C驱动器磁盘的根目录下的一个二进制文件hzk16,按二进制方式读写 操作。两个反斜线“\\ ‖中的第一个表示转义字符,第二个表示根目录。
பைடு நூலகம்
//程序功能:从键盘上输入一个字符串,存储到一个磁盘文件lwz.dat中 //使用格式:可执行文件名=要创建的磁盘文件名 void main(void) 定义一个文件指针 { FILE *fp; char ch; 如果打开文件失败返回的指针为空 if ((fp=fopen("lwz.dat","w"))==NULL){ printf("can not open this file\n"); getch(); 打开文件操作失败,退出程序 exit(-1); } //以下程序是输入字符并存储到指定文件中,以输入符号“@‖作为文件结 束 输入字符并存储到lwz.dat文件中 printf("输入字符\n"); for( ; (ch=getchar()) != '@' ; )fputc(ch,fp); 退出循环,关闭fp指向的文件 fclose(fp); }
an ^
structnode *fv(struct node *head) 若是空链,能正常退出 { struct node *p,*q,*s; 到达节点an之后,需 要做什么? q=head;s=q;p=q->next; while(s){ s=p->next; q head q s p p s p->next=q; q=p; a1 next a2 next a3 next ^ p=s; q } head->next=NULL; an ^ return(q); }