文件是存储在外部介质上的数据的集合_第1页
文件是存储在外部介质上的数据的集合_第2页
文件是存储在外部介质上的数据的集合_第3页
文件是存储在外部介质上的数据的集合_第4页
文件是存储在外部介质上的数据的集合_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

10、文件10.1概述•

文件是存储在外部介质上的数据的集合,由操作系统来管理。最常用的是磁盘文件。•从文件数据的组织形式可分为文本文件和二进制文件。

源程序文件一般是文本文件

数据文件可是文本文件,也可是二进制文件•C语言把文件都看作“字节流”文件,也称“流式文件”,对文件的读写是以字节为单位的。

C语言中的文本文件的每个字节代表一个字符,存放的是该字符的ASCII码

C语言中的二进制文件是把数据按其在内存中的存储形式照原样输出到磁盘上•C语言中对文件处理的方法可分为两种:

缓冲文件系统系统自动为打开的文件开辟其各自的内存缓冲区,本章介绍的文本文件和二进制文件都属此种非缓冲文件系统系统不自动开辟内存缓冲区,而由用户根据需要在程序中设定10.2文件类型(FILE)指针•FILE类型处理一个文件须知它的各种信息,这些信息由系统将其构成一个结构体类型,取名FILE,谓之文件类型,其定义放在stdio.h头文件中。

typedefstruct

{int_fd;

/*文件号*/

int_cleft;

/*缓冲区中剩下的字符*/

int_mode;

/*文件操作模式*/

char*_nextc;

/*文件当前位置*/

char*_buff;}FILE;/*文件缓冲区位置*/

•FILE类型指针

包含了stdio.h头文件就可用FILE来定义文件类

型的指针变量。

如:FILE*fp;

可以使fp指向某一文件的结构体变量,从而可通过该结构体变量中的各项信息来实现对该文件的操作。一个文件指针用来操作一个文件。如有n个文件,一般应定义n个文件类型指针变量来分别指向n

个文件。10.3文件的打开和关闭1.文件打开函数fopen()

FILE*fopen(char*filename,char*mode)

调用时:

•filename(文件名)为要打开文件的文件名(字符串),可写成:"test.dat"

或定义过chars[]="test.dat";则写s;

或定义过char*pc="test.dat";则写pc;

或定义过#defineff"test.dat";则写ff。

•mode为文件使用方式或称打开方式,可以是:"r"

—只读,为输入打开一个文本文件;"w"—只写,为输出打开一个文本文件;"a"—追加,向文本文件尾追加数据;"rb"

—只读,为输入打开一个二进制文件;"wb"—只写,为输出打开一个二进制文件;"ab"—追加,向二进制文件尾追加数据;"r+"—读写,为读/写打开一个文本文件;"w+"—读写,为读/写建立一个新文本文件;"a+"—读写,为读/写(追加)打开一个文本文件。

•打开文件常用如下语句:if((fp=fopen("file1.dat","r"))==NULL)

{printf("cannotopenthisfile.\n");

exit();}

如果调用fopen()成功,返回一文件类型指针,否则返回一空指针。其中exit()是个进程控制库函数,其作用是关闭所有文件,终止程序运行。格式为:

voidexit(intstatus)2.文件关闭函数fclose()

格式:intfclose(FILE*fp)

如果文件关闭成功,返回0,如检测到任何错误,则返回EOF(即-1,在头文件stdio.h中定义)。10.4文件的输入和输出10.4.1读写一个字符的函数—fgetc()和fputc()1.fgetc()函数格式:intfgetc(FILE*fp)

功能:从一打开的文件中读一个字符,返回该字符。文件中有一个指向当前位置的指针自动后移一个字符。反复调用可一直读到文件结束。文件结束或出错时,返回EOF。C语言提供了一个检测文件结束函数:

intfeof(FILE*fp)

如果文件结束,返回非0值,否则返回0。【例7.1】设计程序读一个源程序文件,并在屏幕上显示。源程序文件名为:“c:\tc\hello.c”。#include"stdio.h"main(){FILE*fp;charch;if((fp=fopen("c:\\tc\\hello.c","r"))==NULL){printf("cannotopenthisfile.\n");exit();}

ch=fgetc(fp);

while(feof(fp)==0){putchar(ch);ch=fgetc(fp);}fclose(fp);}其中:

ch=fgetc(fp);

while(feof(fp)==0){putchar(ch);ch=fgetc(fp);}

也可写成:

while(!feof(fp)){ch=fgetc(fp);putchar(ch);}

或:

while((ch=fgetc(fp))!=EOF)putchar(ch);2.fputc()函数格式:intfputc(charch,FILE*fp)

功能:将字符ch写到fp指向的文件中去,成功,则返回该字符,否则返回EOF。【例7.2】将字符串“WelcomeFleshman!”写入c:\tc下名为“file1.dat”的磁盘文件中。#include"stdio.h"main(){FILE*fp;charch;if((fp=fopen("c:\\tc\\file1.dat","w"))==NULL){printf("cannotopenthisfile.\n");exit();}while((ch=getchar())!='\n')

fputc(ch,fp);fclose(fp);}

运行时输入:WelcomeFleshman!例:复制一个磁盘文件。#include"stdio.h"main(){FILE*in,*out;

charch,infile[10],outfile[10];

printf("Entertheinfilename:\n";gets(infile);

printf("Entertheoutfilename:\n";gets(outfile);if((in=fopen(infile,"r"))==NULL){printf("cannotopeninfile.\n");exit();}

if((out=fopen(outfile,"r"))==NULL){printf("cannotopenoutfile.\n");exit();}while(!feof(in))

fputc(fgetc(in),out);

fclose(in);

fclose(out);}10.4.2块读写函数—fread()和fwrite()格式:

intfread(void*buf,intsize,intn,FILE*fp)intfwrite(void*buf,intsize,intn,FILE*fp)其中:void*buf:任何类型指向数据块(首址)的指针,intsize:要读写的数据块字节数,intn:

要读写的数据块个数,FILE*fp:

指向已打开的要读写文件的指针。读或写成功,返回读或写数据块个数功能:从fp指定的文件读取或写入长度为size的n个数据块,存到或取自buf所指向的内存区。例:建一函数,把上一章举例的学生数据链表的内容存入文件。voidsave(structstudent*head,FILE*fp){structstudent*p;for(p=head;p;p=p->next)fwrite(p,sizeof(*p),1,fp);}【例7.3】设职工数据为:工号、姓名、性别、年龄、工资,将6名职工的数据从键盘输入,然后送入磁盘文件worker1.rec中保存。再读此文件并输出这些数据,依次打印出来。#include<stdio.h>#defineSIZE6structworker_type{intnum,age;charname[10],sex;floatpay;}worker[SIZE];voidsave(){FILE*fp;inti;if((fp=fopen("worker1.rec","wb"))==NULL){printf("Cannotopenfile.\n");exit();}for(i=0,i<SIZE;i++){if(fwrite(&worker[i],sizeof(structworker_type),1,fp)!=1)

printf("filewriteerror.\n");}

fclose(fp);}main(){inti;FILE*fp;for(i=0;i<SIZE;i++)

scanf("%d%s%c%d%f",&worker[i].num,

worker[i].name,&worker[i].sex,

&worker[i].age,

&worker[i].pay);save();printf("\nNoNameSexAgePay\n");

fp=fopen("worker1.rec","rb");

for(i=0;i<SIZE;i++)

{

fread(&worker[i],sizeof(struct

worker_type),1,fp);

printf("%5d%-8s%-5c%-5d%6.2f\n",

worker[i].num,worker[i].name,worker[i].sex,

worker[i].age,worker[i].pay);

}}输入和输出结果见p.154例(填空):以下程序把从键盘读入的10个整数以二进制方式写到一个名为bi.dat的新文件中。#include<stdio.h>FILE*fp;main(){inti,j;if((fp=fopen(______,"wb"))==NULL)

exit(0);for(i=0;i<10;i++)

{scanf("%d",&j);fwrite(&j,_________,1,__);}

fclose(fp);}"bi.dat"fpsizeof(int)10.4.3

其他读写函数1.字符串读写函数

•读字符串函数格式:char*fgets(char*string,intn,FILE*fp)

功能:从fp指定的文件读取长度为n-1的字符串存入起始地址为string的内存空间,自动加结束标志'\0',共占n个字符,返回值为地址string。

若在未读足n-1个字符前遇到换行符'\n'或文件结束就停止读取。若读到文件末尾或出错,则返回NULL值。•写字符串函数格式:

int

fputs(char*string,FILE*fp)

其中string可以是字符串常量,字符数组名

或字符指针。功能:将string指向的字符串写到fp指定的文件。但不输出字符串结束符。写成功,则返回所写的最后一个字符,否则返回EOF值。例(填空):从键盘上输入一个字符串,把其中的小写字母改成大写,输出到文件test.txt中,然后从该文件读出此字符串并显示。#include<stdio.h>

main(){FILE*fp;charstr[100];inti=0;gets(str);if((fp=fopen("test.txt",_____))==NULL){printf("Can'topenthisfile.\n");exit(0);}

while(str[i])

{if(str[i]>='a'&&str[i]<='z')

str[i]=______;

fputc(str[i],fp);i++;}fclose(fp);

fp=fopen("test.txt",_____);

fgets(str,100,fp);printf("%s\n",str);fclose(fp);}"w""r"str[i]-322.格式化读写函数•调用格式:

fscanf(FILE*fp,格式说明,输入表列)

fprintf(FILE*fp,格式说明,输出表列)•说明:

这两个函数与scanf()和printf()

相似,只是读写对象不同,前者是文件,后者是终端。

这两个函数读写的是文本文件。【例7.5】有一封英文信,其文件名为:letter.txt。统计信中大写字母的个数,句子的总数。#include<stdio.h>main(){FILE*fp;charc;intk,m;if((fp=fopen("letter.txt","r"))==NULL){printf("cannotopenthisfile.\n");exit();}k=m=0;while(fscanf(fp,"%c",&c)!=EOF)

{if(c<='Z'&&c>='A')k++;/*k统计大写字母*/

if(c=='.')m++;/*m统计句子*/

printf("%c",c);}

printf("Capitalletternumbers:%d\n",k);printf("Sentencenumbers:%d\n",m);fclose(fp);}上机实验9一个班级有n个学生,每个学生有学号、姓名和三门课的成绩。要求编程实现以下的功能:1)输入n,再依次输入n个学生的信息

温馨提示

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

评论

0/150

提交评论