程序设计基础9-文件(2015春)_第1页
程序设计基础9-文件(2015春)_第2页
程序设计基础9-文件(2015春)_第3页
程序设计基础9-文件(2015春)_第4页
程序设计基础9-文件(2015春)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

第9章文件C语言执行程序输入数据输出数据100200300存在问题:运行完毕,结果消失!输入数据和运行结果能否长期保存呢?使用文件!9.1文件概述文件file通常是磁盘上的一段命名的存储区。C将文件看成是连续的字节序列,其中每个字节都可以单独地读取。

文件命名规则主文件名[.扩展名]例如example.cppdata1.inc1.txt文件命名规则,遵循操作系统的约定。

文件类别按文件的编码结构文本文件(Textfile)

ASCII文件,按字符的ASCII存放。

可在屏幕上按字符显示,能读懂。

例如:C语言源程序文件.c或.cpp、记事本文件。

文件末尾有文件结尾符,一般是EOF。二进制文件(Binaryfile):按二进制编码来存放

可在屏幕上显示,但无法读懂。

例如:可执行的C程序.exe。

可合法地包含任何字符,没有文件结束符。9.2

文件指针(FilePointer)程序通过文件打开和关闭操作使用文件。文件的打开和关闭通过文件指针实现。文件指针的类型为FILE*

FILE*指针变量名;

例如:FILE*fp;

表示:定义了FILE*型指针变量fp,标识一个特定的磁盘文件。9.3文件的打开与关闭文件操作方式:打开读写关闭。文件操作由库函数完成。文件打开

FILE*fopen(constchar*filename,constchar*mode);

如果打开成功,返回值为此文件的指针。如果打开失败(文件损坏或不存在),返回值NULL。

文件关闭intfclose(FILE*fp);如果成功关闭,返回值0。如果关闭时有错误,返回值为非零值。

文件打开方式mode9.4

文本文件的读写使用文件操作函数都要求包含头文件“stdio.h”。字符读写函数fgetc和fputc:是以字符(字节)为单位的读写函数,每次可从文本文件读出或向文件写入一个字符。1.

字符读函数fgetc格式:字符变量=fgetc(文件指针);功能:从指定的文件中读一个字符。例如:ch=fgetc(fp);9.4

文本文件的读写2.

字符写函数fputc格式:fputc(字符,文件指针);功能:把一个字符写入指定的文件中。说明:待写入的字符可以是字符常量或变量。例如:fputc(‘a’,fp);注意:文件指针和文件内部的位置指针不同。1、文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的;2、文件内部的位置指针用用于指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。文件指针□□□□□□□□位置指针#include<stdio.h>main(){FILE*fpin,*fpout;charch;if((fpin=fopen("d:\\c1.txt","wt"))==NULL){printf("Cannotopenfile!");return;}printf("inputastring:\n");

ch=getchar();while(ch!='\n'){fputc(ch,fpin);ch=getchar();}fclose(fpin);

【例9.1】从键盘输入一行字符,写入文本文件中,再从文本文件读出字符并显示。if((fpout=fopen("d:\\c1.txt","rt"))==NULL){printf("\nCannotopenfile!");return;}ch=fgetc(fpout);while(ch!=EOF){putchar(ch);ch=fgetc(fpout);}fclose(fpout);}9.4.2字符串读写函数fgets和fputs1.读字符串函数fgets格式:fgets(字符数组名,n,文件指针);功能:从指定的文件中读一个字符串到字符数组中。说明:n表示从文件中读出的字符串不超过n-1个字符,在读入的最后一个字符后自动加上‘\0'。例如:fgets(str,n,fp);注意:(1)在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。(2)fgets函数的返回值是字符数组的首地址。【例9.2】从c1.txt文件中读入一个含10个字符的字符串显示。

#include<stdio.h>main(){FILE*fp;charstr[11];if((fp=fopen("d:\\c1.txt","rt"))==NULL){printf("\nCannotopenfilestrikeanykeyexit!");return;}

fgets(str,11,fp);printf("%s\n",str);fclose(fp);}2.

写字符串函数fputs格式:fputs(字符串,文件指针);功能:向指定的文件写入一个字符串。说明:字符串可以是字符串常量、字符数组名、指针变量。例如:fputs(“abcd“,fp);//把字符串“abcd”写入fp所指的文件之中。【例9.3】在文件c1.txt中追加一个字符串。#include<stdio.h>main(){FILE*fp;charch,st[20];if((fp=fopen("d:\\c1.txt","at+"))==NULL)//以追加方式打开文件

{printf("Cannotopenfilestrikeanykeyexit!");return;}printf("inputastring:\n");scanf("%s",st);fputs(st,fp);//将st表示的字符串追加到fp所指的文件中

fclose(fp);}#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp1,*fp2;charstr[]="123456789";

//创建文本文件wang.txt

fp1=fopen("wang.txt","w"); if(fp1==NULL)//创建文件失败

{printf("cannotopenfile:wang.txt\n");exit(0);}//将字符串“12345678”写入文件

fputs(str,fp1);//写入第一行文本的换行符和下一行文本

fputs("\nabcd",fp1);fclose(fp1);//关闭文件wang.txtfp1向文件wang.txt中写入两行文本,然后分三次读出其内容。

3132333435363738390D0A61626364"123456789"回车换行符’\n’“abcd"

fp2=fopen("wang.txt","rt");//以只读方式打开wang.txt文件

fgets(str,8,fp2);//读取字符串,最大长度是7,将是"1234567"printf("%s\n",str);fgets(str,8,fp2);//读取字符串,最大长度是7,实际上将是"89\n"printf("%s\n",str);fgets(str,8,fp2);//读取字符串,最大长度是7,实际上将是"abcd"printf("%s\n",str);fclose(fp2);//关闭打开的文件}wang.txt3132333435363738390D0A61626364fp2位置指针位置指针运行结果:1234567第一次读取"1234567"位置指针第二次读取“89\n"位置指针89第三次读取“abcd"abcd9.5

二进制的读写1、数据块读写函数fread和fwtrite

数据块读写函数,可用于读写一组数据,如一个数组元素、一个结构体变量等数据。格式:fread(buffer,size,count,fp);功能:读数据块。格式:fwrite(buffer,size,count,fp);功能:写数据块。说明:(1)buffer:是一个指针,在fread函数中表示输入数据的首地址,在fwrite函数中表示存放要输出数据的首地址。(2)size:数据块的字节数。(3)count:要读写的数据块块数。(4)fp:文件指针。例如:fread(fa,4,5,fp);含义:从fp所指的文件读4个字节送入指针fa中,连续读5次。【例9.4】从键盘输入五个学生数据,写入一个文件中,再读出五个学生的数据显示在屏幕上。#include<stdio.h>structstud{charname[10];intnum;}sw[5],sr[5],*pw,*pr;main(){FILE*fp;charch;inti;if((fp=fopen("d:\\st.dat","wb+"))==NULL){printf("Cannotopenfile!");return;}

pw=sw;pr=sr;printf("inputdata:namenum\n");for(i=0;i<5;i++)scanf("%s%d",sw[i].name,&sw[i].num);fwrite(pw,sizeof(structstud),5,fp);rewind(fp);fread(pr,sizeof(structstud),5,fp);

printf("\nnamenum\n");for(i=0;i<5;i++)printf("%s%5d\n",sr[i].name,sr[i].num);fclose(fp);}2、格式化读写函数fscanf和fprintffscanf(文件指针,格式字符串,输入表列);fprintf(文件指针,格式字符串,输出表列);例如:

fscanf(fp,"%d%s",&i,s);fprintf(fp,"%d%c",j,ch);#include<stdio.h>#include<stdlib.h>voidmain(){inti=3;floatf=(float)9.8;FILE*fp;//创建文本文件wang.txtfp=fopen("wang.txt","w");if(fp==NULL)//创建失败

{printf("can'tcreatefile:wang.dat\n");exit(0);}//将变量i和f的值格式化输出到文件中

fprintf(fp,"%2d,%6.2f",i,f);fclose(fp);//关闭文件wang.txtfp【例】将变量的值格式化写入文件中,然后从文件中格式化读出并显示。

20332C2020392E3830ASCII码对应字符'''3'',''''''9''.''8''0'%2d%6.2f

//以读的方式打开文件wang.txt

fp=fopen("wang.txt","r");if(fp==NULL)//打开失败

{printf("can'topenfile:wang.dat\n");exit(0);}i=0;//i清0f=0;//f清0//从文件中读取数值到变量i和ffscanf(fp,"%d,%f",&i,&f);fclose(fp);//关闭文件

//显示从文件中读取的变量i和f的值

printf("i=%2d,f=%6.2f\n",i,f);}wang.txtfp20332C2020392E3830ASCII码对应字符'''3'',''''''9''.''8''0'i=3f=9.80运行结果:i=3,f=9.80注意:文件格式化输出函数fprintf总是以字符串的形式将数据信息存放到文件中,而不是以数值的形式存放到文件中,不管打开的是文本文件还是二进制文件。9.6文件操作的其它函数1、判断文件是否结束函数(feof)feof(fp)用于测试fp所指向的文件内部位置指针是否指向文件结束。如果是文件结束,函数feof(fp)的值为1----(真)。如果文件不结束,函数feof(fp)的值为0----(假)。feof函数既可用以判断二进制文件,又可以判断文本文件。【例9.6】将一个文件的数据据复制到另一个文件中。

#include<stdio.h>main(){FILE*fpin,*fpout;charch;if((fpin=fopen("d:\\c1.txt","rt"))==NULL)

{printf("Cannotopen");return;}if((fpout=fopen("d:\\c2.txt","wt"))==NULL)

{printf("Cannotopenc2.txtfile!");return;}【例9.6】将一个文件的数据据复制到另一个文件中。

ch=fgetc(fpin);while(!feof(fpin))

{ putchar(ch);fputc(ch,fpout);ch=fgetc(fpin);}fclose(fpin);fclose(fpout);}

2、文件定位格式:rewind(文件指针);功能:把文件内部位置指针移到文件首部。文件指针fp332C202039203036614547位置指针文件指针fp332C202039203036614547位置指针rewind(fp)2、文件定位格式:fseek(文件指针,位移量,起始点);功能:移动文件内部位置指针到指定位置。说明:(1)文件指针:指向被移动的文件。(2)位移量:移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错。当用常量表示位移量时,要求加后缀‘L’。(3)起始点:表示从何处开始计算位移量。起始点有三种:文件首部、当前位置、文件尾。起始点文件开始

SEEK_SET0文件当前位置

SEEK_CUR1文件末尾

SEEK_END2例如:fseek(fp,100L,0);//把文件内部位置指针移到离文件首部100个字节处注意1:fseek函数一般用于二进制文件,因为在文本文件中要对字节进行转换,计算的位置不易确定。注意2:在移动位置指针之后,即可用任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。【例9.7】从学生文件st.dat中读出第二个学生的数据显示在屏幕上。#include<stdio.h>structstud{charname[10];intnum;}st;main(){FILE*fp;if((fp=fopen("d:\\st.dat","rb+"))==NULL){printf("Cannotopenfile!");return0;}rewind(fp);//将文件内部位置指针移到文件首部

fseek(fp,1*sizeof(structstud),0);//将文件内部位置指针指向第2个学生信息首部

fread(&st,sizeof(structstud),1,fp);//读出第2个学生信息

printf("namenum\n");printf("%s%5d\n",,st.num);fclose(fp);}3、ftell函数flell函数用于获得文件当前位置指针的位置,函数返回文件中当前位置指针相对于文件首部的字节数。若fp已指向一个正确打开的文件,函数调用方式如下:

longt;t=ftell(fp);注意:

若函数调用时出错,返回-1L。【例

温馨提示

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

评论

0/150

提交评论