您好,欢迎访问三七文档
C语言中没有输入输出语句,所有的输入输出功能都用ANSIC提供的一组标准库函数来实现。文件操作标准库函数有:文件的打开操作fopen打开一个文件文件的关闭操作fclose关闭一个文件文件的读写操作fgetc从文件中读取一个字符fputc写一个字符到文件中去fgets从文件中读取一个字符串fputs写一个字符串到文件中去fprintf往文件中写格式化数据fscanf格式化读取文件中数据fread以二进制形式读取文件中的数据fwrite以二进制形式写数据到文件中去getw以二进制形式读取一个整数putw以二进制形式存贮一个整数文件状态检查函数feof文件结束ferror文件读/写出错clearerr清除文件错误标志ftell了解文件指针的当前位置文件定位函数rewind反绕fseek随机定位文件的打开1.函数原型FILE*fopen(char*pname,char*mode)2.功能说明按照mode规定的方式,打开由pname指定的文件。若找不到由pname指定的相应文件,就按以下方式之一处理:(1)此时如mode规定按写方式打开文件,就按由pname指定的名字建立一个新文件;(2)此时如mode规定按读方式打开文件,就会产生一个错误。打开文件的作用是:(1)分配给打开文件一个FILE类型的文件结构体变量,并将有关信息填入文件结构体变量;(2)开辟一个缓冲区;(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;FILE*:指出fopen是一个返回文件类型的指针函数;3.参数说明pname:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。mode:是一个指向文件处理方式字符串的字符指针。所有可能的文件处理方式见表8.14.返回值正常返回:被打开文件的文件指针。异常返回:NULL,表示打开操作不成功。例如:/*定义一个名叫fp文件指针*/FILE*fp;/*判断按读方式打开一个名叫test的文件是否失败*/if((fp=fopen(test,r))==NULL){/*打开操作不成功*/printf(Thefiletestcannotbeopened.\n);/*结束程序的执行*/exit(1);}要说明的是:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSIC标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错stderr。文件的关闭1.函数原型intfclose(FILE*fp);2.功能说明关闭由fp指出的文件。此时调用操作系统提供的文件关闭功能,关闭由fp-fd指出的文件;释放由fp指出的文件类型结构体变量;返回操作结果,即0或EOF。3.参数说明fp:一个已打开文件的文件指针。4.返回值正常返回:0。异常返回:EOF,表示文件在关闭时发生错误。例如:intn;n=fclose(fp);文件的读写操作A.从文件中读取一个字符1.函数原型intfgetc(FILE*fp);2.功能说明从fp所指文件中读取一个字符。3.参数说明fp:这是个文件指针,它指出要从中读取字符的文件。4.返回值正常返回:返回读取字符的代码。非正常返回:返回EOF。例如,要从写打开文件中读取一个字符时,会发生错误而返回一个EOF。5.实例【例8.1】显示指定文件的内容。程序名为:display.c执行时可用:displayfilename1形式的命令行运行。显示文件filename1中的内容。例如,执行命令行displaydisplay.c将在屏幕上显示display的原代码。/*Filedisplayprogram.*/#includestdio.hmain(intargc,char*argv[])/*命令行参数*/{intch;/*定义文件类型指针*/FILE*fp;/*判断命令行是否正确*/if(argc!=2){printf(Errorformat,Usage:displayfilename1CR\n);exit(1);/*键入了错误的命令行,结束程序的执行*/}/*按读方式打开由argv[1]指出的文件*/if((fp=fopen(argv[1],r))==NULL){/*打开操作不成功*/printf(Thefile%scannotbeopened.\n,argv[1]);/*结束程序的执行*/exit(1);}/*成功打开了argv[1]所指文件*/ch=fgetc(fp);/*从fp所指文件的当前指针位置读取一个字符*/while(ch!=EOF)/*判断刚读取的字符是否是文件结束符*/{putchar(ch);/*若不是结束符,将它输出到屏幕上显示*/ch=fgetc(fp);/*继续从fp所指文件中读取下一个字符*/}/*完成将fp所指文件的内容输出到屏幕上显示*/fclose(fp);/*关闭fp所指文件*/}B.写一个字符到文件中去1.函数原型intfputc(intch,FILE*fp)2.功能说明把ch中的字符写入由fp指出的文件中去。3.参数说明ch:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。fp:这是个文件指针,指出要在其中写入字符的文件。4.返回值正常返回:要写入字符的代码。非正常返回:返回EOF。例如,要往读打开文件中写一个字符时,会发生错误而返回一个EOF。5.实例【例8.2】将一个文件的内容复制到另一个文件中去。程序名为:copyfile.c执行时可用:copyfilefilename1filename2形式的命令行运行,将文件filename1中的内容复制到文件filename2中去。/*filecopyprogram.*/#includestdio.hmain(intargc,char*argv[])/*命令行参数*/{intch;FILE*in,*out;/*定义in和out两个文件类型指针*/if(argc!=3)/*判断命令行是否正确*/{printf(Errorinformat,Usage:copyfilefilename1filename2CR\n);exit(1);/*命令行错,结束程序的执行*/}/*按读方式打开由argv[1]指出的文件*/if((in=fopen(argv[1],r))==NULL){printf(Thefile%scannotbeopened.\n,argv[1]);exit(1);/*打开失败,结束程序的执行*/}/*成功打开了argv[1]所指文件,再*//*按写方式打开由argv[2]指出的文件*/if((out=fopen(argv[2],w))==NULL){printf(Thefile%scannotbeopened.\n,argv[2]);exit(1);/*打开失败,结束程序的执行*/}/*成功打开了argv[2]所指文件*/ch=fgetc(in);/*从in所指文件的当前指针位置读取一个字符*/while(ch!=EOF)/*判断刚读取的字符是否是文件结束符*/{fputc(ch,out);/*若不是结束符,将它写入out所指文件*/ch=fgetc(in);/*继续从in所指文件中读取下一个字符*/}/*完成将in所指文件的内容写入(复制)到out所指文件中*/fclose(in);/*关闭in所指文件*/fclose(out);/*关闭out所指文件*/}【例8.3】按十进制和字符显示文件代码,若遇不可示字符就用井号#字符代替之。程序名为:dumpf.c执行时可用:dumpffilename1形式的命令行运行。/*Filedumpprogram.*/#includestdio.hmain(intargc,char*argv[]){charstr[9];intch,count,i;FILE*fp;if(argc!=2){printf(Errorformat,Usage:dumpffilenameCR\n);exit(1);}if((fp=fopen(argv[1],r))==NULL){printf(Thefile%scannotbeopened.\n,argv[1]);exit(0);}count=0;do{i=0;/*按八进制输出第一列,作为一行八个字节的首地址*/printf(%06o:,count*8);do{/*从打开的文件中读取一个字符*/ch=fgetc(fp);/*按十进制方式输出这个字符的ASCII码*/printf(%4d,ch);/*如果是不可示字符就用#字符代替*/if(ch''||ch'~')str[i]='#';/*如果是可示字符,就将它存入数组str以便形成字符串*/elsestr[i]=ch;/*保证每一行输出八个字符*/if(++i==8)break;}while(ch!=EOF);/*遇到文件尾标志,结束读文件操作*/str[i]='\0';/*在数组str加字符串结束标志*/for(;i8;i++)printf();/*一行不足八个字符用空格填充*/printf(%s\n,str);/*输出字符串*/count++;/*准备输出下一行*/}while(ch!=EOF);/*直到文件结束*/fclose(fp);/*关闭fp所指文件*/}C.从文件中读取一个字符串1.函数原型char*fgets(char*str,intn,FILE*fp)2.功能说明从由fp指出的文件中读取n-1个字符,并把它们存放到由str指出的字符数组中去,最后加上一个字符串结束符'\0'。3.参数说明str:接收字符串的内存地址,可以是数组名,也可以是指针。n:指出要读取字符的个数。fp:这是个文件指针,指出要从中读取字符的文件。4.返回值正常返回:返回字符串的内存首地址,即str的值。非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要从写打开文件中读取字符串,将发生错误而返回一个NULL值。D.写一个字符串到文件中去1.函数原型intfputs(char*str,FILE*fp)2.功能说明把由str指出的字符串写入到fp所指的文件中去。3.参数说明str:指出要写到文件中去的字符串。fp:这是个文件指针,指出字符串要写入其中的文件。4.返回值正常返回:写入文件的字符个数,即字符串的长度。非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个读打开文件中写字符串时,会发生错误而返回一个NULL值。5.实例【例8.4】以下程序将一个文件的内容附加到另一个文件中去。设下面这个程序名为:linkfile.c执行时可用:linkfilefilename1filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。/*filelinkedprogram.*/#includestdio.h#defineSIZE512main(intargc,char*argv[]){charbuffer[SIZE];FILE*fp1,*fp2;if(argc!=3){printf(Usage:linkfilefilename1filename2CR\n);exit(1);}/*按追加方式打开argv[1]所指文件*/if((fp1=fopen(argv[1],a))==NULL){printf(Thefile%scannotbeopened.\n,argv[1]);exit(1);}if((fp2=fopen(argv[2],r))==NULL){printf(Thefile%scannotbeopened.\n,argv[2]);exit(1);}/*读入一行立即写出,直到文件结束*/while(fgets(buffer,SIZE,fp1)!=
本文标题:C语言文件操作
链接地址:https://www.777doc.com/doc-4567505 .html