C语言-文件-加密解密_第1页
C语言-文件-加密解密_第2页
C语言-文件-加密解密_第3页
C语言-文件-加密解密_第4页
C语言-文件-加密解密_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第13章文件操作长春理工大学计算机科学技术学院孙爽滋本章学习内容二进制文件和文本文件文件的翻开和关闭文件的顺序读写与随机读写标准输入输出及其重定向问题的提出1.程序运行时,需大批量输入数据,假设输入有错误,该怎么办?如:对N个整数进行排序2.程序的运行结果想存留下来〔不止是屏幕显示〕,该如何处理?3.操作目标本身就针对一个文档时,如对一个文档进行检索,是否存在“敏感词”。示例对一重要、私密文件进行加密/解密处理。方法一:加密程序+解密程序方法二:加密/解密演示加密程序演示解密程序演示加密/解密程序文件〔File〕文件一般指存储在外部介质上有名字的一组相关数据的集合用文件可长期保存数据,实现数据共享在C语言中,文件可泛指磁盘文件、终端显示器或打印机……程序中的文件在程序运行时由程序在磁盘上建立一个文件,通过写操作将数据存入该文件由程序翻开磁盘上的某个已有文件,并通过读操作将文件中的数据读入内存供程序使用文件的存放〔Storage〕可以建立假设干文件目录(directory\folder文件夹)在目录里保存文件同一级目录里保存的文件不能同名对使用者而言,只要知道文件的路径(path,全目录)和文件名,就能使用该文件D:\home\Sunner\main.c这都是托OS的福13.1二进制文件和文本文件

文件的类型〔TypeofFiles〕?二进制文件是一种字节序列,没有字符变换按照数据在内存中的存储形式〔二进制〕存储到文件如整数123,在内存占2个字节,那么文件中也占2个字节文本文件/ASCII码文件是一种字符序列,文件中存储每个字符的ASCII码如整数123在文件中占3个字节,分别存放这3个字符的ASCII码文件的格式〔FormatofFiles〕数据必须按照存入的类型读出,才能恢复其本来面貌公开的标准格式如bmp、tif、gif、jpg和mp3等类型的文件,有大量软件能生成和使用这些类型的文件不公开或加密的文件格式如MicrosoftWord的doc格式就不公开,所以至今没有Word以外的其他软件能完美地读出doc文件

缓冲型和非缓冲型文件系统

缓冲型文件系统指系统自动在内存中为每一个正在使用的文件开辟一个缓冲区,在读写文件时,数据先送到缓冲区,再传给C程序或外存上非缓冲型文件系统不会自动设置文件缓冲区,缓冲区需由程序员自己设定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”

只读必须是已存在的文件。“w”只写不论该文件是否存在,都新建一个文件。“a”

追加向文本文件尾增加数据,该文件必须存在“r+”读写打开一个已存在的文件,用于读写。“w+”读写建立一个新文件,可读可写。“a+”读写向文件尾追加数据,也可读。“rb”“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;/*缓冲区‘满’或‘空’的程度*/

unsignedflags;/*文件状态标志*/

charfd;/*文件描述符*/

unsignedcharhold;/*如无缓冲区不读字符*/

shortbsize;/*缓冲区的大小*/

unsignedchar*buffer;/*数据缓冲区的位置*/

unsignedchar*curp;/*指针当前的指向*/

unsignedistemp;/*临时文件指示器*/

shorttoken;/*用于有效性检查*/}FILE;/*在stdio.h文件中定义*/13.2文件的翻开和关闭intfclose(FILE*fp);把遗留在缓冲区中的数据写入文件,实施操作系统级的关闭操作同时,释放与流联系的文件控制块,以后可以重复使用这局部空间多数情况下,系统限制同时处于翻开状态的文件总数,因此,翻开文件前先关闭无用文件是必要的fclose函数的返回值当顺利地执行了关闭操作,返回值为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宏名。

二进制文件拷贝<练>.下面的程序执行后,文件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的文本文件中逐个读入字符并显示在屏幕上。请填空:

#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字节、7字节B)7字节、5字节C)5字节、7字节D)5字节、5字节B

文本文件:’\n’

磁盘存储时分别为:\和n,占两个字节。内存中:为一个字符(字节)。二进制文件:’\n’磁盘存储和内存是一致的,都为一个字符(字节)。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)待读文件的数据在内存中的起始地址从文件读入的每个数据项的字节数从文件读入的数据项数指向待读文件的指针<例>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);}以上程序执行后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:文件指针的位移量,字节数,long型,加l或L;from:起始位置

fseek()函数:利用该函数可以改变文件指针的位置,从而实现随机读写形式:fseek(fp,offset,from);位移量〔以起始点为基点,移动的字节数)>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()函数:取得文件指针的当前位置,用字节数,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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论