C語言-文件-加密解密_第1頁
C語言-文件-加密解密_第2頁
C語言-文件-加密解密_第3頁
C語言-文件-加密解密_第4頁
C語言-文件-加密解密_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第13章文件操作長春理工大學計算機科學技術學院孫爽滋本章學習內容二進制文件和文本文件文件的翻開和關閉文件的順序讀寫與隨機讀寫標準輸入輸出及其重定向問題的提出1.程序運行時,需大批量輸入數據,假設輸入有錯誤,該怎么辦?如:對N個整數進行排序2.程序的運行結果想存留下來〔不止是屏幕顯示〕,該如何處理?3.操作目標本身就針對一個文檔時,如對一個文檔進行檢索,是否存在“敏感詞”。示例對一重要、私密文件進行加密/解密處理。方法一:加密程序+解密程序方法二:加密/解密演示加密程序演示解密程序演示加密/解密程序文件〔File〕文件一般指存儲在外部介質上有名字的一組相關數據的集合用文件可長期保存數據,實現數據共享在C語言中,文件可泛指磁盤文件、終端顯示器或打印機……程序中的文件在程序運行時由程序在磁盤上建立一個文件,通過寫操作將數據存入該文件由程序翻開磁盤上的某個已有文件,并通過讀操作將文件中的數據讀入內存供程序使用文件的存放〔Storage〕可以建立假設干文件目錄(directory\folder文件夾)在目錄里保存文件同一級目錄里保存的文件不能同名對使用者而言,只要知道文件的路徑(path,全目錄)和文件名,就能使用該文件D:\home\Sunner\main.c這都是托OS的福13.1二進制文件和文本文件

文件的類型〔TypeofFiles〕?二進制文件是一種字節(jié)序列,沒有字符變換按照數據在內存中的存儲形式〔二進制〕存儲到文件如整數123,在內存占2個字節(jié),那么文件中也占2個字節(jié)文本文件/ASCII碼文件是一種字符序列,文件中存儲每個字符的ASCII碼如整數123在文件中占3個字節(jié),分別存放這3個字符的ASCII碼文件的格式〔FormatofFiles〕數據必須按照存入的類型讀出,才能恢復其本來面貌公開的標準格式如bmp、tif、gif、jpg和mp3等類型的文件,有大量軟件能生成和使用這些類型的文件不公開或加密的文件格式如MicrosoftWord的doc格式就不公開,所以至今沒有Word以外的其他軟件能完美地讀出doc文件

緩沖型和非緩沖型文件系統(tǒng)

緩沖型文件系統(tǒng)指系統(tǒng)自動在內存中為每一個正在使用的文件開辟一個緩沖區(qū),在讀寫文件時,數據先送到緩沖區(qū),再傳給C程序或外存上非緩沖型文件系統(tǒng)不會自動設置文件緩沖區(qū),緩沖區(qū)需由程序員自己設定13.2文件的翻開和關閉下面介紹的函數均定義在<stdio.h>中FILE*fopen(constchar*filename,constchar*mode);FILE*fp=fopen("D:\\A.TXT","r");filename是文件名包含路徑。如果不含路徑,表示翻開當前目錄下的文件mode是翻開方式常用為"r"、"w"、"rw"和"a",分別表示只讀、只寫、讀寫和添加,"rb"表示只讀二進制文件返回值為指向此文件的指針,留待以后使用如果翻開失敗,返回值為NULL

mode:對應二進制文件“r”

只讀必須是已存在的文件?!皐”只寫不論該文件是否存在,都新建一個文件?!癮”

追加向文本文件尾增加數據,該文件必須存在“r+”讀寫打開一個已存在的文件,用于讀寫?!皐+”讀寫建立一個新文件,可讀可寫?!癮+”讀寫向文件尾追加數據,也可讀?!皉b”“wb”“ab”“rb+”“wb+”“ab+”對應文本文件13.2文件的翻開和關閉

應用舉例FILE*fp;fp=fopen(“e:\\sun.txt”,“w”);FILE*fp;fp=fopen(“temp.c”,“r”);FILE*fp;fp=fopen(“d:\\tc\\temp\\a.dat”,“rb”);FILE*fp;fp=fopen(“play.cpp”,“a”);<練>假設要翻開E盤上user子目錄下名為abc.txt的文本文件進行讀、寫操作,下面符合此要求的函數調用是()。 A.fopen(“E:\user\abc.txt","r") B.fopen(“E:\\user\\abc.txt","r+") C.fopen(“E:\user\abc.txt","rb") D.fopen(“E:\\user\\abc.txt","w")13.2文件的翻開和關閉fopen的返回值假設不能實現翻開任務,fopen函數將帶回一個空指針值NULL(值為0)。常用翻開文件的方法為:if(

(fp=fopen(“a1.txt”,”r”))==NULL){printf(“cannotopenthisfile\n”);

exit(0);}13.2文件的翻開和關閉#include<stdlib.h>或#include<cstdlib>文件指針〔FilePointer〕FILE

*fp;是FILE型指針變量,標識一個特定的磁盤文件typedef

struct{

shortlevel;/*緩沖區(qū)‘滿’或‘空’的程度*/

unsignedflags;/*文件狀態(tài)標志*/

charfd;/*文件描述符*/

unsignedcharhold;/*如無緩沖區(qū)不讀字符*/

shortbsize;/*緩沖區(qū)的大小*/

unsignedchar*buffer;/*數據緩沖區(qū)的位置*/

unsignedchar*curp;/*指針當前的指向*/

unsignedistemp;/*臨時文件指示器*/

shorttoken;/*用于有效性檢查*/}FILE;/*在stdio.h文件中定義*/13.2文件的翻開和關閉intfclose(FILE*fp);把遺留在緩沖區(qū)中的數據寫入文件,實施操作系統(tǒng)級的關閉操作同時,釋放與流聯(lián)系的文件控制塊,以后可以重復使用這局部空間多數情況下,系統(tǒng)限制同時處于翻開狀態(tài)的文件總數,因此,翻開文件前先關閉無用文件是必要的fclose函數的返回值當順利地執(zhí)行了關閉操作,返回值為0如果返回值為非零值,表示關閉時有錯誤一般只有驅動器中無盤或盤空間不夠時才失敗,關閉失敗會引起數據喪失、文件的破壞和程序中的隨機錯誤一般使用:FILE*fp;fp=fopen("e:\\a.txt","r"); ······ ······ fclose(fp);13.3按字符讀寫文件字符讀寫intfgetc(FILE*fp);從fp讀出一個字符,將位置指針指向下一個字符假設讀成功,那么返回該字符,假設讀到文件尾,那么返回EOF(EOF是一個符號常量,在stdio.h中定義為-1)intfputc(intc,FILE*fp);向fp輸出字符c假設寫入錯誤,那么返回EOF,否那么返回c13.3按字符讀寫文件【例13.1】從鍵盤輸入一串字符,轉存到磁盤文件上為什么要判斷文件打開是否成功呢?

【例13.2】將0~127之間的ASCII字符寫到文件中,然后從文件中讀出并顯示到屏幕上文本文件判斷是否是文件尾,用EOF<例>分析程序的功能。

判斷二進制文件是否結束——feof函數

。

#include<stdio.h>main(){FILE*in,*out;charch;

in=fopen(“e:\\sun\\abc.txt”,"rb");out=fopen(“e:\\sun\\abc.bak”,"wb");

while(!feof(in)){ch=fgetc(in);fputc(ch,out);}fclose(in);

fclose(out);}fputc(fgetc(in),out);函數feof()檢查是否到達文件尾,當文件位置指針指向文件尾時,返回非0值,否那么返回0值

判斷文本文件是否結束——用EOF宏名。

二進制文件拷貝<練>.下面的程序執(zhí)行后,文件test.t中的內容是()。

#include<stdio.h>

voidfun(char*fname.,char*st)

{FILE*myf;inti;myf=fopen(fname,"w");

for(i=0;i<strlen(st);i++)fputc(st[i],myf);

fclose(myf);

}main()

{fun("test.t","newworld");fun("test.t","hello,");}

A.hello,B.newworldhello,

C.newworldD.hello,rld<練>.08年4月國二考題以下程序從名為filea.dat的文本文件中逐個讀入字符并顯示在屏幕上。請?zhí)羁眨?/p>

#include<stdio.h>

main()

{FILE*fp;charch;

fp=fopen(【】);

ch=fgetc(fp);

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

putchar(‘\n’);fclose(fp);}

“filea.dat","r"

<練>2012年9月國二考題對于下述程序,在方式串分別采用"w+"和"wb"運行時,兩次生成的文件TEST的長度分別是〔〕。#include<stdio.h>voidmain(){FILE*fp=fopen(“TEST”,【翻開方式】);fputc(′A′,fp);fputc(′\n′,fp);fputc(′B′,fp);fputc(′\n′,fp);fputc(′C′,fp);fclose(fp);}

A)7字節(jié)、7字節(jié)B)7字節(jié)、5字節(jié)C)5字節(jié)、7字節(jié)D)5字節(jié)、5字節(jié)B

文本文件:’\n’

磁盤存儲時分別為:\和n,占兩個字節(jié)。內存中:為一個字符(字節(jié))。二進制文件:’\n’磁盤存儲和內存是一致的,都為一個字符(字節(jié))。13.4按格式讀寫文件格式化讀寫intfscanf(FILE*fp,const

char*format,...);fscanf(fp,"%d,%f",&i,&t);第1個參數為文件指針,第2個參數為格式控制參數,第3個參數為地址參數表列intfprintf(FILE*fp,const

char*format,...);fprintf(fp,"%d,%6.2f",i,t);第1個參數為文件指針,第2個參數為格式控制參數,第3個參數為輸出參數表列<例>讀程序,寫結果。#include<stdio.h>main(){FILE*fp;inti=5;floatx=3.14;

fp=fopen(“e:\\exam.txt”,“w”);

fprintf(fp,“i=%d,x=%f”,i,x);fclose(fp);}<例>讀程序,寫結果。#include<stdio.h>main(){FILE*fp;inti=5;floatx=3.14;fp=fopen(“e:\\exam.txt”,“w”);printf(“i=%d,x=%f”,i,x);fclose(fp);}輸出重定向<例>讀程序,寫結果。#include<stdio.h>main(){FILE*fp;inti;floatx;fp=fopen(“e:\\exam.txt”,“r”);fscanf(fp,“%d%f”,&i,&x);printf(“i=%d,x=%f”,i,x);fclose(fp);}假定,e盤下有一文件exam.txt,內容為:23.5fscanf(fp,“%d,%f”,&i,&x);假設換成此語句,程序結果會怎樣?<練>.09年3月國二考題有以下程序#include<stdio.h>main(){ FILE*f; f=fopen("filea.txt","w"); fprintf(f,"abc"); fclose(f);}假設文本文件filea.txt中的原有內容為:hello,那么運行以上程序后,文件filea.txt中的內容為()。A.helloabc B.abclo C.abcD.abchello<練>.08年4月國二考題#include<stdio.h>

main()

{FILE*fp;inta[10]={1,2,3},i,n;

fp=fopen(“dl.dat”,”w”);

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

fprintf(fp,”%d”,a[i]);

fprintf(fp,”\n”);

fclose(fp);

fp=fopen(“dl.dat”,”r”);

fscanf(fp,”%d”,&n);

fclose(fp);

printf(“%d\n”,n);

}

程序的運行結果是:A)12300B)123C)1 D)321<練>.程序運行后的輸出結果是()。#include<stdio.h>main(){FILE*fp;inti=20,j=30,k,n;fp=fopen〔"d1.dat","w"〕;fprintf(fp,"%d\n",i);fprintf(fp,"%d\n",j);fclose(fp);fp=fopen("d1.dat","r");fp=fscanf(fp,"%d%d",&k,&n);printf("%d%d\n",k,n);fclose(fp);}A.2030B.2050 C.3050 D.302013.5按數據塊讀寫文件按數據塊讀寫fread(buff,size,count,fp)待讀文件的數據在內存中的起始地址從文件讀入的每個數據項的字節(jié)數從文件讀入的數據項數指向待讀文件的指針<例>floatf[2];FILE*fp;fp=fopen(“aa.dat”,“rb”);

fread(f,4,2,fp);for(i=0;i<2;i++)

fread(&f[i],4,1,fp);<例>structstudent{intnum;charname[20];charsex;intage;floatscore[3];}stud[10];for(i=0;i<10;i++)

fread(&stud[i],sizeof(structstudent),1,fp);#include<stdio.h>main(){charc;FILE*fp;fp=fopen(“e:\\sun\\a.txt”,”wb”);for(c=‘a’;c<=‘z’;c++)

fwrite(&c,1,1,fp);fclose(fp);}<例>分析程序的功能。<練>08年9月國二考題#include<stdio.h>main(){ FILE*pf; char*s1="China",*s2="Beijing"; pf=fopen("abc.dat","wb+"); fwrite(s2,7,1,pf);

rewind(pf);/*文件位置指針回到文件頭*/ fwrite(s1,5,1,pf); fclose(pf);}以上程序執(zhí)行后abc.dat文件的內容是:A.China B.Chinang C.ChinaBeijing D.BeijingChina10.6.1文件的隨機讀寫文件指針:翻開的文件中有一個位置指針指示動遷的讀寫位置,對文件每進行一次讀寫,文件指針自動指向下一個讀寫位置,那么可方便地進行順序讀寫,利用定位函數還可實現隨機讀寫.rewind()函數功能:使文件指針重新指向文件的開頭位置。此函數沒有返回值形式:rewind(fp)

fp為指向fopen函數翻開的文件的指針。<例>

對一個磁盤文件進行顯示和復制兩次操作#include<stdio.h>main(){FILE*fp1,*fp2;charch;fp1=fopen("d:\\sun\\a.txt","r");fp2=fopen("d:\\sun\\aa.bak","w");while((ch=fgetc(fp1))!=EOF)

putchar(ch);

rewind(fp1);while((ch=fgetc(fp1))!=EOF)

fputc(ch,fp2);

fclose(fp1);fclose(fp2);}fp:為指向fopen函數翻開的文件的指針;offset:文件指針的位移量,字節(jié)數,long型,加l或L;from:起始位置

fseek()函數:利用該函數可以改變文件指針的位置,從而實現隨機讀寫形式:fseek(fp,offset,from);位移量〔以起始點為基點,移動的字節(jié)數)>0向后移動<0向前移動例fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);10.6.1文件的隨機讀寫起始點文件開始

SEEK_SET0文件當前位置

SEEK_CUR1文件末尾

SEEK_END2rewind〔〕函數:fseek()函數:

ftell()函數:取得文件指針的當前位置,用字節(jié)數,long類型。10.6.1文件的隨機讀寫#include"stdio.h"main(){FILE*fp;longlength;fp=fopen(“e:\\sun\\a.txt”,"r");if(fp==NULL)printf("filenotfound!\n");else{fseek(fp,0L,SEEK_END);length=ftell(fp);printf("LengthofFileis%1dbytes\n",length);

fclose(fp);}}<例>分析程序功能。求文件長度<練習>以下程序的功能是()。#include<stdio.h>main(){FILE*fp;fp=fopen(“abc.txt","r+");while(!feof(fp))if(fgetc(fp)==’*’)

{fseek(fp,-1L,SEEK_CUR);

fputc(‘$’,fp);

fseek(fp,ftell(fp),SEEK_SET);}fclose(fp);}A.將abc文件中所有’*’替換為’$’B.查找abc文件中所有’*’C.查找abc文件中所有’$’D.將abc文件中所有字符替換為’$’計算機根底教學部<例>文件加密程序。將一文本文件進行簡單加密。加密算法是:文件中的字符如果是字母,將其按字母表的順序加4處理,如果是其他字符,那么原內容不改變。如,有一文本文件mine.txt,內容如下:COUNT:xyzPASSWORD:1234567該文件加密后:GSYRX:bcdTEWWASVH:1234567ABCDEFGHIJKLMNOPQRSTUVWXYZ#include<stdio.h>main(){FILE*fp;charch;fp=fopen(“e:\\sun\\mine.txt","r+");while((ch=fgetc(fp))!=EOF){if(ch>=‘a’&&ch<=‘z’||ch>=‘A’&&ch<=‘Z’){ch+=4;if(ch>’z’||ch>‘Z’&&ch<=‘Z’+4)ch-=26;

溫馨提示

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

評論

0/150

提交評論