C基础及其教程 11_第1页
C基础及其教程 11_第2页
C基础及其教程 11_第3页
C基础及其教程 11_第4页
C基础及其教程 11_第5页
已阅读5页,还剩28页未读, 继续免费阅读

下载本文档

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

文档简介

第9章文件操作C语言大学实用教程9.1计算机中的流标准输入输出字符界面的操作系统一般都提供标准输入与输出设备DOS、Linux、Unix……一般情况,标准输入就是键盘,标准输出就是终端显示器操作系统有能力重定向标准输入与输出,比如让文件作为标准输入(标准输出)这种重定向程序本身是感觉不到的自来水厂I/O设备输入设备键盘、鼠标软盘、硬盘(以文件的形式)串行口、并行口、USB接口、网络端口扫描仪、视频采集卡、电视卡、游戏杆、话筒……输出设备显示器、打印机软盘、硬盘(以文件的形式)串行口、并行口、USB接口、网络端口音箱……单纯的输入设备或者单纯的输出设备越来越少DOS下的标准输入输出重定向程序prog如下main()

{

charc;

while((c=getchar())!='\n')

putchar(++c);

}输入重定向prog<infile.txt输出重定向prog>outfile.txt流(Stream)水流“子在川上曰:逝者如斯夫”计算机中的流的概念一般称为数据流,也有叫做字节流、比特流的,还有很具体的文件流、视频流、音频流等时光不能倒流,但计算机中的很多流都是会倒流的如果你想重新读已经读过的数据,或者要修改已经写入的数据,可以发出流控(FlowControl)命令不会倒流的数据流也很多,例如网络上的数据流。网络和数据线等介质只有很小的数据缓冲区,没有大量存储的能力9.2文件(File)计算机的内存容易健忘,所以数据必须保存在硬盘、软盘、光盘和磁带等“不健忘”的外存上这些能大量、永久保存信息的媒介,一般都以文件的形式给用户及应用程序使用文件一般指存储在外部介质上具有名字(文件名)的一组相关数据的集合用文件可长期保存数据,并实现数据共享程序中的文件

在程序运行时由程序在磁盘上建立一个文件,并通过写操作将数据存入该文件;或由程序打开磁盘上的某个已有文件,并通过读操作将文件中的数据读入内存供程序使用文件的存放可以建立若干目录(文件夹),在目录里保存文件,同一级目录里保存的文件不能同名。对使用者而言,只要知道文件的路径(全目录)和文件名,就能使用该文件C:\home\Sunner\main.c

这都是托OS的福文件的类型二进制文件是一种字节序列,没有字符变换按照数据在内存中的存储形式存储到文件如整数127,在内存占2个字节,为0000000001111111,则文件中也存储为0000000001111111,占2个字节文本文件/ASCII码文件是一种字符序列文件中存储每个字符的ASCII码如整数127在文件中占3个字节,分别存放这3个字符的ASCII码,即49,50,55文件的格式数据必须按照存入的类型读出,才能恢复其本来面貌公开的标准格式如bmp、tif、gif、jpg和mp3等类型的文件,有大量软件能生成和使用这些类型的文件也有不公开、甚至加密的文件格式如MicrosoftWord的doc格式就不公开,所以至今还没有Word以外的其它软件能完美地读出doc文件9.3基本文件操作基本文件操作函数open:打开文件获得对此文件的指针、引用和句柄等,以证明可以使用此文件read:读文件参数一般指明要读多少字节,读到哪块内存。每次调用此功能,都是接着上次调用的结束位置读(所以是个输入流)write:写文件参数一般指明把哪块内存的内容写入文件,要写多少字节。每次调用此功能,都是接着上次调用的结束位置写(所以是个输出流)close:关闭文件表明操作结束,不再使用此文件。文件使用完毕必须关闭,否则影响系统性能seek:文件定位随机控制流的当前位置C语言中的文件访问#include<io.h>#include<fcntl.h>intopen(const

char*pathname,intaccess);intfd=open("C:\\CONFIG.SYS",O_RDWR|O_CREAT);pathname是文件名,包含路径。如果不含路径,表示打开当前目录下的文件access是打开方式,常用为O_RDONLY、O_WRONLY、O_RDWR与O_CREAT、O_TRUNC、O_APPEND的或运算返回值为文件句柄(FileHandle),留待以后使用。如果打开失败,返回值为-1C语言中的文件访问intread(inthandle,

void*buf,

unsignedlen);intn_read=read(fd,buf,BUFSIZ);从文件中读len个字节存到buf开始的地址单元中handle是open获得的文件句柄buf是保存读入内容的内存指针len是最大可以读入的字节数返回值为实际读入的字节数,可能大于len。返回0表示读到了末尾,返回-1表示出错C语言中的文件访问intwrite(inthandle,

void*buf,

unsignedlen);intn_write=write(fd,buf,BUFSIZ);把从buf开始的len个字节写入文件handle是open获得的文件句柄buf是要写入内容的内存指针len是写入多少字节返回值为实际写入的字节数,可能小于len。返回-1表示出错C语言中的文件访问intclose(inthandle);intret=close(fd);把遗留在缓冲区中的数据写入文件handle是open获得的文件句柄关闭成功返回0,否则返回-1驱动器中无盘或盘空间不够时会引起关闭失败C语言中的文件访问longlseek(inthandle

longoffset

intfromwhere);intpos=lseek(fd,100L,SEEK_CUR);handle是open获得的文件句柄offset是相对fromwhere的位置偏移多少,可以为负数fromwhere: SEEK_SET-----文件开始

SEEK_CUR-----当前位置

SEEK_END-----文件末尾成功返回移位后的当前位置,从文件头算起;否则返回-1L几个巧妙运用curPos=lseek(fh,0L,SEEK_CUR);得到当前位置指针的位置fileLength=lseek(fh,0L,SEEK_END);得到文件长度C语言独特的文件访问下面介绍的函数均定义在<stdio.h>中FILE*fopen(const

char*filename,const

char*mode);FILE*fp=fopen("C:\\CONFIG.SYS","rw");filename是文件名包含路径。如果不含路径,表示打开当前目录下的文件mode是打开方式常用为"r"、"w"、"rw"和"a",分别表示只读、只写、读写和添加"rb"表示只读二进制文件返回值为指向此文件的指针,留待以后使用如果打开失败,返回值为NULLintfclose(FILE*fp);文件指针(FilePointer)FILE*fp;是FILE型指针变量标识一个特定的磁盘文件typedef

struct{

shortlevel;/*缓冲区‘满’或‘空’的程度*/

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

charfd;/*文件描述符*/

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

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

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

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

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

shorttoken;/*用于有效性检查*/}FILE;在stdio.h文件中定义高级文件操作字符读写intfgetc(FILE*fp);从fp读出一个字符并返回若读到文件尾,则返回EOFintfputc(intc,FILE*fp);向fp输出字符c若写入错误,则返回EOF,否则返回c高级文件操作字符串读写char*fgets(char*s,intn,FILE*fp);特例fgets(buf,sizeof(buf),stdin);intfputs(const

char*s,FILE*fp);高级文件操作格式化读写intfscanf(FILE*fp,

const

char*format,

...);fscanf(fp,"%d,%6.2f",&i,&t);intfprintf(FILE*fp,

const

char*format,

...);fprintf(fp,"%d,%6.2f",i,t);高级文件操作按数据块读写unsignedfread(void*ptr,

unsignedsize,

unsignednmemb,

FILE*fp);从fp读数据块到ptrsize是每个数据块的大小nmemb是最多允许写的数据块个数返回实际读到的数据块个数unsignedfwrite(const

void*ptr,

unsignedsize,

unsignednmemb,

FILE*fp);把ptr指向的数据块写入fp高级文件操作文件定位,用于文件的随机读写打开的文件中有一个位置指针指示当前读写位置对文件每进行一次顺序读写,文件指针自动指向下一读写位置intfseek(FILE*fp,

longoffset,

intfromwhere);把fp的位置指针从fromwhere开始移动offset个字节fromwhere: SEEK_SET或0-----文件开始

SEEK_CUR或1-----当前位置

SEEK_END或2-----文件末尾intftell(FILE*fp);返回fp的当前位置指针intrewind(FILE*fp);让fp的位置指针指向文件首字节高级文件操作判断文件是否结束intfeof(FILE*fp);当文件位置指针指向fp末尾时,返回非0值,否则返回0错误处理错误处理文件错误一般都是外界造成的,出错率很高被删除、修改、磁盘空间满、被其他文件打开通过判断返回值发现错误所有文件操作出错时都返回-1出错处理打印错误信息给用户,等待用户的处理voidperror(constchar*s);向标准错误输出字符串s,随后附上错误的文字说明错误处理——例9.1#include<stdio.h>#include<errno.h>#include<io.h>#include<fcntl.h>intmain(void){ /*c:\abc.abc文件并不存在*/

int

fh=open("c:\\abc.abc",O_RDONLY|O_BINARY);

if(fh==-1) /*fh必然为-1*/ {

perror("Can'topenc:\\abc.abc.Error");return-1; }return0;}Can'topenc:\\abc.abc.Error:Nosuchfileordirectory两种方式的文件操作的区别open族的功能一般由OS直接提供,其使用方式也比较具有通用性,在各种语言里基本一样open族通常情况能直接反映文件的真实情况,因为它的操作都不假定文件的任何结构fopen族的函数包装了open族的函数,提供更强大的功能,但是效率略逊fopen族比较适合处理文本文件,或者结构单一的文件。实验

文件复制与追加程序1:根据程序提示从键盘输入一个已存在的文本文件的完整文件名,并再输入一个新文本文件的完整文件名然后编程将已存在文本文件中的内容全部拷贝到新文本文件中去利用文本编辑软件,通过查看文件内容验证程序执行结果。实验

文件复制与追加intmain(void){……/*文件拷贝*/

while((ch=fgetc(fpSrc))!=EOF) {

if(fputc(ch,fpDst)==EOF) {

printf("Copyfailed!"); exit(0); } }

printf("Copysucceed.\n");return0;}#include<stdio.h>#defineMAXLEN80int

CopyFile(constchar*srcName,constchar*dstName);intmain(void){

char

srcFilename[MAXLEN]; /*源文件名*/

char

dstFilename[MAXLEN]; /*目标文件名*/

printf("Inputsourcefilename:");

scanf("%s",srcFilename);

printf("Inputdestinationfilename:");

scanf("%s",dstFilename);

if(CopyFile(srcFilename,dstFilename)) {

printf("Copysucceed.\n"); }

else {

perror("Copyfailed:");return-1; }return0;}例9.3文件复制intCopyFile(const

char*srcName,const

char*dstName){ FILE*fpSrc=NULL; FILE*fpDst=NULL; intch,rval=1;

fpSrc=fopen(srcName,"rb");

if(fpSrc==NULL)

gotoERROR; fp

温馨提示

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

评论

0/150

提交评论