C++文件讀寫(xiě)專(zhuān)業(yè)知識(shí)講座_第1頁(yè)
C++文件讀寫(xiě)專(zhuān)業(yè)知識(shí)講座_第2頁(yè)
C++文件讀寫(xiě)專(zhuān)業(yè)知識(shí)講座_第3頁(yè)
C++文件讀寫(xiě)專(zhuān)業(yè)知識(shí)講座_第4頁(yè)
C++文件讀寫(xiě)專(zhuān)業(yè)知識(shí)講座_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

上周回憶#defineA3#defineBA+2#defineC2*B+1請(qǐng)問(wèn)C*2值是多少?將C替代為2*3+2+1,再乘以2則為2*3+2+1*2,最后值應(yīng)當(dāng)為10第1頁(yè)第12章文件本章重點(diǎn):掌握文獻(xiàn)基本概念掌握文獻(xiàn)類(lèi)型指針理解文獻(xiàn)操作基本辦法掌握文獻(xiàn)處理函數(shù)第2頁(yè)12.1C文獻(xiàn)概述12.1.1文獻(xiàn)基本概念一、文獻(xiàn):是指存放在外部介質(zhì)上數(shù)據(jù)集合。二、文獻(xiàn)存在形式及分類(lèi)文獻(xiàn)存在形式:文獻(xiàn)名+文獻(xiàn)內(nèi)容。

文獻(xiàn)內(nèi)容:是一種字符(字節(jié))序列,即由一種個(gè)字符(字節(jié))數(shù)據(jù)次序組成。對(duì)文獻(xiàn)存取是以字符(字節(jié))為單位,此類(lèi)文獻(xiàn)稱(chēng)為流式文獻(xiàn)。

第3頁(yè)文獻(xiàn)分類(lèi):⑴ASCII碼文獻(xiàn)(文本文獻(xiàn)):文獻(xiàn)每一種字節(jié)放一種ASCII代碼,代表一種字符。⑵二進(jìn)制文獻(xiàn):把內(nèi)存中數(shù)據(jù)按其在內(nèi)存中存儲(chǔ)形式原樣輸出到文獻(xiàn)上。根據(jù)數(shù)據(jù)在內(nèi)存組織形式不一樣可分為兩類(lèi)文獻(xiàn)∶ASCII碼文獻(xiàn)(文本文獻(xiàn))二進(jìn)制文獻(xiàn)根據(jù)數(shù)據(jù)讀寫(xiě)方式不一樣可分為兩類(lèi)文獻(xiàn)∶次序存取文獻(xiàn)隨機(jī)存取文獻(xiàn)第4頁(yè)三、文獻(xiàn)基本操作

打開(kāi)文獻(xiàn)∶把文獻(xiàn)名等目錄信息從磁盤(pán)上讀入內(nèi)存并存入構(gòu)造體。(2)關(guān)閉文獻(xiàn)∶把內(nèi)存構(gòu)造體中文獻(xiàn)名等目錄信息寫(xiě)入磁盤(pán)。(3)寫(xiě)文獻(xiàn)∶向文獻(xiàn)寫(xiě)內(nèi)容。(4)讀文獻(xiàn)∶從文獻(xiàn)讀內(nèi)容。第5頁(yè)1.文獻(xiàn)類(lèi)型(FILE)每個(gè)被使用文獻(xiàn)都在內(nèi)存中開(kāi)辟一種區(qū),用來(lái)寄存文獻(xiàn)有關(guān)信息(如文獻(xiàn)名,狀態(tài),目前位置等)。這些信息保存在一種構(gòu)造體類(lèi)型變量中。構(gòu)造體類(lèi)型由系統(tǒng)定義為“FILE”。12.1.2文獻(xiàn)指針第6頁(yè)2.定義FILE類(lèi)型指針變量FILE類(lèi)型指針變量定義辦法∶FILE*指針變量名;例如:FILE*fp;含義:fp是一種指向FILE類(lèi)型構(gòu)造體指針變量,定義后fp能夠指向某個(gè)文獻(xiàn)了。能夠使fp指向某個(gè)文獻(xiàn)構(gòu)造體變量,從而通過(guò)該構(gòu)造體變量中文獻(xiàn)信息能夠訪問(wèn)該文獻(xiàn)。

第7頁(yè)例1:把”hello!”保存到磁盤(pán)文獻(xiàn)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頁(yè)例2:將1.txt中信息復(fù)制到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頁(yè)例3:將f1.txt中第一種字符輸出到屏幕上,并修改第一種字符為‘x’,將第5個(gè)字符改為‘y’。保存到磁盤(pán)文獻(xiàn)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頁(yè)例4:從f1.txt中讀一種長(zhǎng)度為3字符串,放到str數(shù)組中,并將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頁(yè)例5:把數(shù)組a中字符串寫(xiě)入文獻(xiàn)f1.txt,再?gòu)膄1.txt中讀取字符串寄存到字符數(shù)組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頁(yè)12.2文獻(xiàn)打開(kāi)與關(guān)閉12.2.1文獻(xiàn)打開(kāi)函數(shù)(fopen函數(shù))(1)調(diào)用方式:FILE*fp;fp=fopen(文獻(xiàn)名,文獻(xiàn)使用方式);所要打開(kāi)文獻(xiàn)名。用雙引號(hào)引發(fā)字符串常量。

具有特定含意符號(hào)必須由雙引號(hào)引發(fā)顧客定義文獻(xiàn)類(lèi)型指針變量⑵功能:以指定方式打開(kāi)指定文獻(xiàn),若操作成功,則返回一種指向該文獻(xiàn)指針,若打開(kāi)文獻(xiàn)時(shí)出現(xiàn)錯(cuò)誤,則返回空指針NULL。例∶FILE*fp;fp=fopen("stu.dat","r");第13頁(yè)⑶文獻(xiàn)使用方式(表12.1)基本方式字符(單獨(dú)使用是對(duì)文本文獻(xiàn)):r僅為讀而打開(kāi)。(只讀文獻(xiàn))

w僅為寫(xiě)而打開(kāi)。(建立新文獻(xiàn))

a僅為添加而打開(kāi)。(寫(xiě)舊文獻(xiàn))

按二進(jìn)制格式讀寫(xiě)文獻(xiàn)(基本方式字符+“b”)∶b輔助說(shuō)明,按二進(jìn)制格式讀寫(xiě)文獻(xiàn)。

同步進(jìn)行讀寫(xiě)文獻(xiàn)(基本方式字符+[“b”]+“+”)∶+輔助說(shuō)明,可同步進(jìn)行讀和寫(xiě)文獻(xiàn)。

例如:fp=(“stu.dat”,“rb”);例如:fp=(“stu.dat”,“r+”);第14頁(yè)例:#include<stdio.h>main(){FILE*fp;if((fp=fopen("stu.dat","r"))==NULL){printf("filenotfound.");exit(0);}else{printf("fileopenedok!");fclose(fp);}}程序運(yùn)行成果:假如磁盤(pán)上存在文獻(xiàn)stu.dat,屏幕上會(huì)顯示fileopenok!,不然屏幕上顯示filenotfound.。常使用此辦法打開(kāi)一種文獻(xiàn)exit函數(shù)功能是關(guān)閉所有文獻(xiàn),終止程序運(yùn)行。exit(0)為正常終止程序第15頁(yè)12.2.2文獻(xiàn)關(guān)閉函數(shù)(fclose函數(shù))(1)調(diào)用方式:

fclose(文獻(xiàn)指針);

⑵功能:關(guān)閉由文獻(xiàn)指針指定文獻(xiàn),把緩沖區(qū)中數(shù)據(jù)(未裝滿緩沖區(qū)數(shù)據(jù))輸出到磁盤(pán)上,釋放文獻(xiàn)指針。例如:FILE*fp;fp=fopen(“output.dat”,“r+”);……/*進(jìn)行讀寫(xiě)操作*/fclose(fp);注意:fopen函數(shù)和fclose函數(shù)總是成對(duì)出現(xiàn)。無(wú)fclose函數(shù)時(shí)會(huì)造成部分?jǐn)?shù)據(jù)丟失!第16頁(yè)12.3文獻(xiàn)讀寫(xiě)12.3.1單個(gè)字符操作讀寫(xiě)函數(shù)這兩個(gè)函數(shù)是以字符為單位進(jìn)行文獻(xiàn)讀寫(xiě)函數(shù)。1.fputc函數(shù)一般調(diào)用形式:

fputc(字符常量或變量,文獻(xiàn)指針);功能:把指定字符存入文獻(xiàn)指針?biāo)肝墨I(xiàn)中。假如輸出失敗,則返回一種EOF(-1)。例如:fputc(ch,fp);(其中ch為字符變量,fp為文獻(xiàn)指針)含義:將ch值輸出到fp所指向文獻(xiàn)中去。(EOF是在stdio.h文獻(xiàn)中定義符號(hào)常量,值為-1)第17頁(yè)2.fgetc函數(shù)一般調(diào)用形式:

字符變量=fgetc(文獻(xiàn)指針);功能:從文獻(xiàn)指針?biāo)肝墨I(xiàn)中讀一種字符賦給指定字符變量。當(dāng)遇文獻(xiàn)結(jié)束符,返回一個(gè)文獻(xiàn)結(jié)束標(biāo)志EOF(-1)。例如:ch=fgetc(fp);其中ch為字符變量,fp為文獻(xiàn)指針。含義:從fp所指向文獻(xiàn)中讀入一種字符賦給字符變量ch。第18頁(yè)例:閱讀程序。#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);}若文獻(xiàn)file.txt內(nèi)容是:abcd1234ABCD輸出成果:12這是讀一種文本文獻(xiàn)中字符,并判斷文獻(xiàn)是否結(jié)束常用辦法第19頁(yè)12.3.2字符串讀寫(xiě)函數(shù)這兩個(gè)函數(shù)是以字符串為單位進(jìn)行文獻(xiàn)讀寫(xiě)函數(shù)。一般調(diào)用形式:

fputs(字符串,文獻(xiàn)指針);1.fputs函數(shù)功能:向指定文獻(xiàn)輸出一種字符串。例如:fputs(str,fp);(其中str是字符數(shù)組名)含義:向fp所指向文獻(xiàn)中輸出str中字符串。第20頁(yè)2.fgets函數(shù)fgets(字符串,字符串長(zhǎng)度,文獻(xiàn)指針);功能:從指定文獻(xiàn)中讀入一種字符串。例如:fgets(str,n,fp);(其中str是字符數(shù)組名)含義:從fp指向文獻(xiàn)讀取長(zhǎng)度為n-1字符串,最后加一種‘\0’存入字符數(shù)組str中。調(diào)用形式:第21頁(yè)練習(xí):使用fgets(str,n,fp)函數(shù)從文獻(xiàn)中讀入一種字符串,下列論述錯(cuò)誤是()。A)字符串讀入后會(huì)自動(dòng)加入’\0’B)fp是指向該文獻(xiàn)文獻(xiàn)型指針C)fgets函數(shù)將從文獻(xiàn)中最多讀入n-1個(gè)字符D)fgets函數(shù)將從文獻(xiàn)中最多讀入n個(gè)字符D第22頁(yè)12.3.3數(shù)據(jù)塊讀寫(xiě)函數(shù)一般調(diào)用形式:

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);其中:buffer:是一種指針。(是起始地址)。對(duì)fread來(lái)說(shuō),它是讀入數(shù)據(jù)寄存地址。對(duì)fwrite來(lái)說(shuō),它是輸出數(shù)據(jù)地址。size:要讀寫(xiě)字節(jié)數(shù)。count:要進(jìn)行讀寫(xiě)多少個(gè)size字節(jié)數(shù)據(jù)項(xiàng)。功能:對(duì)fp所指文獻(xiàn)讀寫(xiě)buffer所指size*count個(gè)字節(jié)數(shù)據(jù)。

例如:fread(f,4,2,fp);(其中f是實(shí)型數(shù)組名)第23頁(yè)例1把數(shù)組a寫(xiě)入文獻(xiàn)tmp;再?gòu)膖mp讀入數(shù)組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頁(yè)練習(xí):#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頁(yè)12.3.4格式化讀寫(xiě)函數(shù)這兩個(gè)函數(shù)是進(jìn)行格式讀寫(xiě)文獻(xiàn)函數(shù)。一般調(diào)用形式:

fprintf(文獻(xiàn)指針,格式字符串,輸出列表);

fscanf(文獻(xiàn)指針,格式字符串,輸入列表);例如:fprintf(fp,“%d,%6.2f”,i,x);功能:按指定格式將數(shù)據(jù)寫(xiě)到指定文獻(xiàn)中?;驈闹付ㄎ墨I(xiàn)按格式輸入數(shù)據(jù)。又如:fscanf(fp,“%d,%f”,&i,&x);第26頁(yè)練習(xí):#include"stdio.h"main(){ FILE*pf; pf=fopen("filea.txt","w"); fprintf(pf,"abc"); fclose(pf);}若文本文獻(xiàn)filea.txt中原有內(nèi)容為:hello,則運(yùn)行以上程序后,文獻(xiàn)filea.txt中內(nèi)容為:()CA)helloabcB)abcloC)abcD)abchello第27頁(yè)12.4文獻(xiàn)定位1.rewind函數(shù)一般調(diào)用形式:

rewind(文獻(xiàn)指針);功能:使位置指針重新返回文獻(xiàn)開(kāi)頭,無(wú)返回值。第28頁(yè)例:有一種磁盤(pán)文獻(xiàn),第一次將它內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一種文獻(xiàn)上。#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頁(yè)2.fseek函數(shù)一般調(diào)用形式:

fseek(文獻(xiàn)指針,位移量,起始點(diǎn));

起始點(diǎn):用0、1、2或其對(duì)應(yīng)名字SEEK_SET、SEEK_CUR、SEEK_END替代,分別表示文獻(xiàn)開(kāi)始、文獻(xiàn)目前位置、文獻(xiàn)末尾。位移量:指以起始點(diǎn)為基點(diǎn),向前移動(dòng)字節(jié)數(shù)。ANSIC標(biāo)準(zhǔn)要求在數(shù)字末尾加一種字母L,表達(dá)long型。功能:把文獻(xiàn)讀寫(xiě)位置指針移到指定位置。第30頁(yè)例如:fseek(fp,128L,0);

將位置指針移到離文獻(xiàn)頭128個(gè)字節(jié)處。例如:fseek(fp,-10L,2);

將位置指針從文獻(xiàn)末尾處向后退10個(gè)字節(jié)。注意:fseek函數(shù)一般用于二進(jìn)制文獻(xiàn)。

第31頁(yè)3.ftell函數(shù)一般調(diào)用形式:

ftell(文獻(xiàn)指針);功能:返回文獻(xiàn)位置指針目前值。例如:pos=ftell(fp);獲取fp指向文獻(xiàn)目前讀寫(xiě)位置,并將其值賦給變量pos。第32頁(yè)12.5小結(jié)(1)文獻(xiàn)是指存放在外部介質(zhì)上數(shù)據(jù)集合。(2)對(duì)文獻(xiàn)操作包括文獻(xiàn)打開(kāi)、關(guān)閉、讀、寫(xiě)、文獻(xiàn)定位和犯錯(cuò)檢查等。目前分別介紹如下:① 在C語(yǔ)言中使用fopen()函數(shù)完成對(duì)文獻(xiàn)打開(kāi)操作。其一般調(diào)用方式為:fopen("文獻(xiàn)名","操作方式");② 關(guān)閉文獻(xiàn)用函數(shù)fclose()函數(shù)來(lái)實(shí)現(xiàn),其調(diào)用形式為:fclose(fp);第33頁(yè)文獻(xiàn)讀函數(shù)包括fgetc()函數(shù)、fgets()函數(shù)、fread()函數(shù)和fscanf()函數(shù)。fgetc()函數(shù)功能是從指定文獻(xiàn)中讀入一種字符。fgets()函數(shù)功能是從文獻(xiàn)指針?biāo)赶蛭墨I(xiàn)中,讀入一種字符串。fscanf()函數(shù)為格式化輸入函數(shù),其功能是從指定文獻(xiàn)中讀取指定格式數(shù)據(jù)。fread()函數(shù)功能是從指定文獻(xiàn)中讀入一組數(shù)據(jù)。④ 有關(guān)寫(xiě)操作函數(shù)主要有fputc()函數(shù)、fputs()函數(shù)、fwrite()函數(shù)和fprintf()函數(shù)。第34頁(yè)fputs()函數(shù),功能是將字符串寫(xiě)入文獻(xiàn)指針?biāo)肝墨I(xiàn)中。fputs()函數(shù)帶返回值。如輸出成功,返回值為0,不然返回文獻(xiàn)結(jié)束標(biāo)志EOF其值為-1。fprintf()函數(shù)為格式化輸出函數(shù),其功能是把輸出數(shù)據(jù)發(fā)送到指定文獻(xiàn)中。fwrite()函數(shù)功能是將buffer所指向內(nèi)存區(qū)域中數(shù)據(jù)寫(xiě)入文獻(xiàn)指針fp所指文獻(xiàn)中,這些數(shù)據(jù)共有count項(xiàng),每項(xiàng)長(zhǎng)度為size個(gè)字節(jié),因此字節(jié)總數(shù)為count*size。

第35頁(yè)12.6文獻(xiàn)綜合實(shí)例編寫(xiě)一種程序,從data.txt文本文獻(xiàn)中讀出一種字符,將其加密后寫(xiě)入data1.txt文獻(xiàn)中,加密方式是字符ASCII碼加1。分析:先打開(kāi)data.txt文本文獻(xiàn)并建立data1.txt文獻(xiàn),從前者讀出一種字符c,將(c+1)%256這個(gè)ASCII碼對(duì)應(yīng)字符寫(xiě)入后者中。直到讀完為止。第36頁(yè)#include<stdio.h>voidmain(){FILE*fp,*fp1;charc;if((fp=fopen("data.txt","r"))==NULL){printf("不能打開(kāi)文獻(xiàn)\n");return;}if((fp1=fopen("data1.txt","w"))==NULL){printf("不能建立文獻(xiàn)\n");return;}第37頁(yè)

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

第38頁(yè)編寫(xiě)程序,創(chuàng)建數(shù)據(jù)文獻(xiàn)goods.dat用于存放商品信息。已知每一種商品包括:名稱(chēng),單價(jià),進(jìn)貨量,和庫(kù)存4項(xiàng)數(shù)據(jù)。按指定格式讀寫(xiě),寫(xiě)入5件商品信息。第39頁(yè)#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頁(yè)for(count=0;;count++){ fprintf(“%d”,count+1);scanf(“%s%d%d”,name,&price,&amount,&stock); if(price==0) break;

printf(fp,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論