C++文件读写专业知识讲座_第1页
C++文件读写专业知识讲座_第2页
C++文件读写专业知识讲座_第3页
C++文件读写专业知识讲座_第4页
C++文件读写专业知识讲座_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

上周回忆#defineA3#defineBA+2#defineC2*B+1请问C*2值是多少?将C替代为2*3+2+1,再乘以2则为2*3+2+1*2,最后值应当为10第1页第12章文件本章重点:掌握文献基本概念掌握文献类型指针理解文献操作基本办法掌握文献处理函数第2页12.1C文献概述12.1.1文献基本概念一、文献:是指存放在外部介质上数据集合。二、文献存在形式及分类文献存在形式:文献名+文献内容。

文献内容:是一种字符(字节)序列,即由一种个字符(字节)数据次序组成。对文献存取是以字符(字节)为单位,此类文献称为流式文献。

第3页文献分类:⑴ASCII码文献(文本文献):文献每一种字节放一种ASCII代码,代表一种字符。⑵二进制文献:把内存中数据按其在内存中存储形式原样输出到文献上。根据数据在内存组织形式不一样可分为两类文献∶ASCII码文献(文本文献)二进制文献根据数据读写方式不一样可分为两类文献∶次序存取文献随机存取文献第4页三、文献基本操作

打开文献∶把文献名等目录信息从磁盘上读入内存并存入构造体。(2)关闭文献∶把内存构造体中文献名等目录信息写入磁盘。(3)写文献∶向文献写内容。(4)读文献∶从文献读内容。第5页1.文献类型(FILE)每个被使用文献都在内存中开辟一种区,用来寄存文献有关信息(如文献名,状态,目前位置等)。这些信息保存在一种构造体类型变量中。构造体类型由系统定义为“FILE”。12.1.2文献指针第6页2.定义FILE类型指针变量FILE类型指针变量定义办法∶FILE*指针变量名;例如:FILE*fp;含义:fp是一种指向FILE类型构造体指针变量,定义后fp能够指向某个文献了。能够使fp指向某个文献构造体变量,从而通过该构造体变量中文献信息能够访问该文献。

第7页例1:把”hello!”保存到磁盘文献f1.txt中。#include"stdio.h"main(){ FILE*fp; if((fp=fopen(“f1.txt","w"))==NULL) { printf("can'topenthefile\n"); exit(0); }

fputs("hello!",fp);// fprintf(fp,“hello!\n");

fclose(fp);}第8页例2:将1.txt中信息复制到2.txt中。#include"stdio.h"main(){ charch; FILE*fp1,*fp2; if((fp1=fopen("1.txt","r"))==NULL) { printf("can'topenthefile\n"); exit(0);} if((fp2=fopen("2.txt","w"))==NULL) { printf("can'topenthefile\n"); exit(0);} while(!feof(fp1)) { ch=fgetc(fp1);//fscanf(fp1,"%c",&ch);

fputc(ch,fp2); //fprintf(fp2,"%c",ch); } fclose(fp1); fclose(fp2);}第9页例3:将f1.txt中第一种字符输出到屏幕上,并修改第一种字符为‘x’,将第5个字符改为‘y’。保存到磁盘文献f1.txt中。#include“stdio.h”main(){FILE*fp; charch; fp=fopen("f1.txt","r+"); ch=fgetc(fp); putchar(ch);

rewind(fp); fputc(‘x',fp);

fseek(fp,4L,0); fputc(‘y',fp); }第10页例4:从f1.txt中读一种长度为3字符串,放到str数组中,并将str中字符串输出到f1.txt最后。#include“stdio.h”main(){ FILE*fp; charstr[20]; fp=fopen("f1.txt","r+");

fgets(str,4,fp); puts(str); fseek(fp,0L,2); fputs(str,fp); fclose(fp);}第11页例5:把数组a中字符串写入文献f1.txt,再从f1.txt中读取字符串寄存到字符数组b中。#include"stdio.h"main(){ chara[]="13579",b[10]; inti; FILE*fp; fp=fopen("f1.txt","w+");

fwrite(a,1,5,fp); rewind(fp);

fread(b,1,5,fp); for(i=0;i<5;i++) printf("%c,",b[i]);}第12页12.2文献打开与关闭12.2.1文献打开函数(fopen函数)(1)调用方式:FILE*fp;fp=fopen(文献名,文献使用方式);所要打开文献名。用双引号引发字符串常量。

具有特定含意符号必须由双引号引发顾客定义文献类型指针变量⑵功能:以指定方式打开指定文献,若操作成功,则返回一种指向该文献指针,若打开文献时出现错误,则返回空指针NULL。例∶FILE*fp;fp=fopen("stu.dat","r");第13页⑶文献使用方式(表12.1)基本方式字符(单独使用是对文本文献):r仅为读而打开。(只读文献)

w仅为写而打开。(建立新文献)

a仅为添加而打开。(写旧文献)

按二进制格式读写文献(基本方式字符+“b”)∶b辅助说明,按二进制格式读写文献。

同步进行读写文献(基本方式字符+[“b”]+“+”)∶+辅助说明,可同步进行读和写文献。

例如:fp=(“stu.dat”,“rb”);例如:fp=(“stu.dat”,“r+”);第14页例:#include<stdio.h>main(){FILE*fp;if((fp=fopen("stu.dat","r"))==NULL){printf("filenotfound.");exit(0);}else{printf("fileopenedok!");fclose(fp);}}程序运行成果:假如磁盘上存在文献stu.dat,屏幕上会显示fileopenok!,不然屏幕上显示filenotfound.。常使用此办法打开一种文献exit函数功能是关闭所有文献,终止程序运行。exit(0)为正常终止程序第15页12.2.2文献关闭函数(fclose函数)(1)调用方式:

fclose(文献指针);

⑵功能:关闭由文献指针指定文献,把缓冲区中数据(未装满缓冲区数据)输出到磁盘上,释放文献指针。例如:FILE*fp;fp=fopen(“output.dat”,“r+”);……/*进行读写操作*/fclose(fp);注意:fopen函数和fclose函数总是成对出现。无fclose函数时会造成部分数据丢失!第16页12.3文献读写12.3.1单个字符操作读写函数这两个函数是以字符为单位进行文献读写函数。1.fputc函数一般调用形式:

fputc(字符常量或变量,文献指针);功能:把指定字符存入文献指针所指文献中。假如输出失败,则返回一种EOF(-1)。例如:fputc(ch,fp);(其中ch为字符变量,fp为文献指针)含义:将ch值输出到fp所指向文献中去。(EOF是在stdio.h文献中定义符号常量,值为-1)第17页2.fgetc函数一般调用形式:

字符变量=fgetc(文献指针);功能:从文献指针所指文献中读一种字符赋给指定字符变量。当遇文献结束符,返回一个文献结束标志EOF(-1)。例如:ch=fgetc(fp);其中ch为字符变量,fp为文献指针。含义:从fp所指向文献中读入一种字符赋给字符变量ch。第18页例:阅读程序。#include"stdio.h"#defineNULL0main(){FILE*fp;intcount=0;charc;if((fp=fopen(“file.txt”,“r”))==NULL){printf(“Can’tOpenFile\n”);exit(0);}c=fgetc(fp);while(c!=EOF){count++;c=fgetc(fp);}printf(“count=%d\n”,count);fclose(fp);}若文献file.txt内容是:abcd1234ABCD输出成果:12这是读一种文本文献中字符,并判断文献是否结束常用办法第19页12.3.2字符串读写函数这两个函数是以字符串为单位进行文献读写函数。一般调用形式:

fputs(字符串,文献指针);1.fputs函数功能:向指定文献输出一种字符串。例如:fputs(str,fp);(其中str是字符数组名)含义:向fp所指向文献中输出str中字符串。第20页2.fgets函数fgets(字符串,字符串长度,文献指针);功能:从指定文献中读入一种字符串。例如:fgets(str,n,fp);(其中str是字符数组名)含义:从fp指向文献读取长度为n-1字符串,最后加一种‘\0’存入字符数组str中。调用形式:第21页练习:使用fgets(str,n,fp)函数从文献中读入一种字符串,下列论述错误是()。A)字符串读入后会自动加入’\0’B)fp是指向该文献文献型指针C)fgets函数将从文献中最多读入n-1个字符D)fgets函数将从文献中最多读入n个字符D第22页12.3.3数据块读写函数一般调用形式:

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);其中:buffer:是一种指针。(是起始地址)。对fread来说,它是读入数据寄存地址。对fwrite来说,它是输出数据地址。size:要读写字节数。count:要进行读写多少个size字节数据项。功能:对fp所指文献读写buffer所指size*count个字节数据。

例如:fread(f,4,2,fp);(其中f是实型数组名)第23页例1把数组a写入文献tmp;再从tmp读入数组b。#include"stdio.h"main(){FILE*fp;inta[100]={1,5,6,78,21,34,67,87,23},b[100],i;fp=fopen("tmp","wb");

fwrite(a,sizeof(a),1,fp);/*fwrite(a,sizeof(int),100,fp);*/fclose(fp);fp=fopen("tmp","rb");

fread(b,sizeof(a),1,fp);for(puts(""),i=0;i<10;i++)printf("%6d",b[i]);fclose(fp);}第24页练习:#include"stdio.h"main(){ FILE*pf; char*s1="china",*s2="beijing"; pf=fopen("abc.txt","w+"); fwrite(s2,7,1,pf); rewind(pf); fwrite(s1,5,1,pf); fclose(pf);}BA)chinaB)chinangC)chinabeijingD)beijingchina第25页12.3.4格式化读写函数这两个函数是进行格式读写文献函数。一般调用形式:

fprintf(文献指针,格式字符串,输出列表);

fscanf(文献指针,格式字符串,输入列表);例如:fprintf(fp,“%d,%6.2f”,i,x);功能:按指定格式将数据写到指定文献中。或从指定文献按格式输入数据。又如:fscanf(fp,“%d,%f”,&i,&x);第26页练习:#include"stdio.h"main(){ FILE*pf; pf=fopen("filea.txt","w"); fprintf(pf,"abc"); fclose(pf);}若文本文献filea.txt中原有内容为:hello,则运行以上程序后,文献filea.txt中内容为:()CA)helloabcB)abcloC)abcD)abchello第27页12.4文献定位1.rewind函数一般调用形式:

rewind(文献指针);功能:使位置指针重新返回文献开头,无返回值。第28页例:有一种磁盘文献,第一次将它内容显示在屏幕上,第二次把它复制到另一种文献上。#include"stdio.h"main(){ FILE*fp1,*fp2; if((fp1=fopen("f1.txt","r"))==NULL) { printf("Error!\n"); exit(0); } if((fp2=fopen("f2.txt","w"))==NULL) { printf("Error!\n"); exit(0); } while(!feof(fp1))putchar(fgetc(fp1));

rewind(fp1); while(!feof(fp1))fputc(fgetc(fp1),fp2); fclose(fp1);fclose(fp2);}第29页2.fseek函数一般调用形式:

fseek(文献指针,位移量,起始点);

起始点:用0、1、2或其对应名字SEEK_SET、SEEK_CUR、SEEK_END替代,分别表示文献开始、文献目前位置、文献末尾。位移量:指以起始点为基点,向前移动字节数。ANSIC标准要求在数字末尾加一种字母L,表达long型。功能:把文献读写位置指针移到指定位置。第30页例如:fseek(fp,128L,0);

将位置指针移到离文献头128个字节处。例如:fseek(fp,-10L,2);

将位置指针从文献末尾处向后退10个字节。注意:fseek函数一般用于二进制文献。

第31页3.ftell函数一般调用形式:

ftell(文献指针);功能:返回文献位置指针目前值。例如:pos=ftell(fp);获取fp指向文献目前读写位置,并将其值赋给变量pos。第32页12.5小结(1)文献是指存放在外部介质上数据集合。(2)对文献操作包括文献打开、关闭、读、写、文献定位和犯错检查等。目前分别介绍如下:① 在C语言中使用fopen()函数完成对文献打开操作。其一般调用方式为:fopen("文献名","操作方式");② 关闭文献用函数fclose()函数来实现,其调用形式为:fclose(fp);第33页文献读函数包括fgetc()函数、fgets()函数、fread()函数和fscanf()函数。fgetc()函数功能是从指定文献中读入一种字符。fgets()函数功能是从文献指针所指向文献中,读入一种字符串。fscanf()函数为格式化输入函数,其功能是从指定文献中读取指定格式数据。fread()函数功能是从指定文献中读入一组数据。④ 有关写操作函数主要有fputc()函数、fputs()函数、fwrite()函数和fprintf()函数。第34页fputs()函数,功能是将字符串写入文献指针所指文献中。fputs()函数带返回值。如输出成功,返回值为0,不然返回文献结束标志EOF其值为-1。fprintf()函数为格式化输出函数,其功能是把输出数据发送到指定文献中。fwrite()函数功能是将buffer所指向内存区域中数据写入文献指针fp所指文献中,这些数据共有count项,每项长度为size个字节,因此字节总数为count*size。

第35页12.6文献综合实例编写一种程序,从data.txt文本文献中读出一种字符,将其加密后写入data1.txt文献中,加密方式是字符ASCII码加1。分析:先打开data.txt文本文献并建立data1.txt文献,从前者读出一种字符c,将(c+1)%256这个ASCII码对应字符写入后者中。直到读完为止。第36页#include<stdio.h>voidmain(){FILE*fp,*fp1;charc;if((fp=fopen("data.txt","r"))==NULL){printf("不能打开文献\n");return;}if((fp1=fopen("data1.txt","w"))==NULL){printf("不能建立文献\n");return;}第37页

while(!feof(fp)){c=fgetc(fp);c=(c+1)%256;fputc(c,fp1);}fclose(fp);fclose(fp);}

第38页编写程序,创建数据文献goods.dat用于存放商品信息。已知每一种商品包括:名称,单价,进货量,和库存4项数据。按指定格式读写,写入5件商品信息。第39页#include<stdio.h>main(){ intcount,amount,stock; floatprice; charname[20]; FILE*fp;if((fp=fopen(“goods.dat”,”wb”))==NULL){ printf(“cannotopenfile.\n”); exit(0);}第40页for(count=0;;count++){ fprintf(“%d”,count+1);scanf(“%s%d%d”,name,&price,&amount,&stock); if(price==0) break;

printf(fp,

温馨提示

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

评论

0/150

提交评论