C语言文件资料操作常用函数详解.docx
《C语言文件资料操作常用函数详解.docx》由会员分享,可在线阅读,更多相关《C语言文件资料操作常用函数详解.docx(13页珍藏版)》请在冰豆网上搜索。
C语言文件资料操作常用函数详解
C语言文件操作详解
在C语言文件操作的过程中,通常有以下几种方式:
1.单个字符的操作:
fputc
函数原型:
intfputc(intc,FILE*fp);
功能:
把一字节代码c写入fp指向的文件中
返回值:
正常,返回c;出错,为EOF(-1)
fgetc
函数原型:
intfgetc(FILE*fp);
功能:
从fp指向的文件中读取一字节代码
返回值:
正常,返回读到的代码值;读到文件尾或出错,为EOF(-1)
feof
函数原型:
intfeof(FILE*fp);
功能:
判断文件是否到末尾
返回值:
文件未结束,返回0;文件结束,返回真(非0)
示例:
#include
#include
voidmain()
{
charch;
FILE*fp1=fopen("d:
\\a.dat","wb");/*以写的方式打开二进制文件*/FILE*fp2;
if(NULL==fp1)
{
printf("Cannotopenthisfile!
\n");
exit(0);
}
printf("pleaseinputastring:
");
ch=getchar();
while(ch!
='#')/*输入#号结束*/
{
fputc(ch,fp1);/*依次向文件中写*/
ch=getchar();
}
fflush(stdin);/*清空输入缓冲区*/
fclose(fp1);/*关闭文件*/
fp2=fopen("d:
\\a.dat","rb");/*以读的方式打开二进制文件*/if(NULL==fp2)
{
printf("Cannotopenthisfile!
\n");
exit(0);
}
while(!
feof(fp2))/*判断是否到达文件末尾*/
{
ch=fgetc(fp2);/*从文件中依次读取*/
putchar(ch);
}
putchar('\n');
fflush(stdout);/*清空输出缓冲区*/
fclose(fp2);/*关闭文件*/
}
注意:
putc(ch,fp)与fputc(ch,fp)效果一致,但是putc可以作为宏替换,速度更快getc(fp)与fgetc(fp)效果一致,但是getc可以作为宏替换,速度更快
putchar(c)则是fputc(c,stdout)
getchar()则是fgetc(stdin)
2.对字符串的操作:
char*fgets(char*s,intn,FILE*fp)
intfputs(char*s,FILE*fp)
功能:
fgets:
从fp指向的文件中读一个长度为n的字符串,保存到s中。
其中char*s要是已经有内存空间的,通常是用数组定义的,或者用char*则要用malloc分配内存。
fputs:
向fp所指向的文件中写入字符串s。
返回值:
fgets:
正常时返回读取字符串的首地址;出错或文件尾,返回NULL
fputs:
正常时返回写入的最后一个字符;出错为EOF(-1)
示例:
#include
#include
#include
voidmain()
{
FILE*fp;
charstring[100];
if((fp=fopen("file.txt","w"))==NULL)
{
printf("cann'topenthisfile!
\n");
exit(0);
}
while(strlen(gets(string))>0)/*从键盘输入字符串,回车停止*/{
fputs(string,fp);/*将字符串写入文件*/
fputs("\n",fp);/*在最后加上一个’\n’*/
}
fclose(fp);
if((fp=fopen("file.txt","r"))==NULL)
{
printf("cann'topenthisfile!
\n");
exit(0);
}
while(fgets(string,10,fp)!
=NULL)/*判断是否到达文件末尾*/fputs(string,stdout);/*等价于puts(string);*/
fclose(fp);
}
3.对二进制形式的块读写:
函数原型:
size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp);size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp);功能:
读/写数据块fread与fwrite一般用于二进制文件的输入/输出
fread:
从fp所指向的文件中读取count个块,每个块的长度为size个字节,存放到以buffer为首地址的内存中。
其中buffer必须已经是由内存空间的。
fwrite:
从以buffer为首地址的内存中读取count个块,每个块的长度为size个字节,写入到fp所指向的文件中。
返回值:
成功,返回读/写的块数;出错或文件尾,返回0
说明:
buffer:
指向要输入/输出数据块的首地址的指针
size:
读/写的数据块的大小(字节数)
count:
要读/写的数据块的个数
fp:
要读/写的文件指针
示例:
#include
#include
typedefstructSTUDENT
{
charsNo[5];
charsName[20];
doublescore;
}STUDENT;
voidmain()
{
/*只对单个的时候*/
//intx=19;
//inty=0;
//FILE*fp=fopen("d:
\\a.dat","wb");
//if(NULL==fp)
//{
//printf("Cannotopenthisfile!
\n");
//exit(0);
//}
//fwrite(&x,sizeof(x),1,fp);
//fclose(fp);
//
//fp=fopen("d:
\\a.dat","rb");
//if(NULL==fp)
//{
//printf("Cannotopenthisfile!
\n");
//exit(0);
//}
//fread(&y,sizeof(y),1,fp);
//printf("%d\n",y);
//fclose(fp);
/*对于块的时候*/
//intx[]={1,2,3,4,5,6,7,8,9};
//inty[9]={0};
//inti;
//FILE*fp=fopen("d:
\\a.txt","wb");
//if(NULL==fp)
//{
//printf("Cannotopenthisfile!
\n");
//exit(0);
//}
//fwrite(x,sizeof(int),sizeof(x)/sizeof(int),fp);
//fclose(fp);
//
//fp=fopen("d:
\\a.txt","rb");
//if(NULL==fp)
//{
//printf("Cannotopenthisfile!
\n");
//exit(0);
//}
//fread(y,sizeof(int),sizeof(y)/sizeof(int),fp);
//for(i=0;i<9;i++)
//{
//printf("%d",y[i]);
//}
//printf("\n");
//fclose(fp);
/*操作一块*/
STUDENTstu[3]={
"0001","xx",89,
"0002","xx",90,
"0003","xx",100
};
STUDENTstu2;
FILE*fp=fopen("d:
\\b.txt","wb+");
if(NULL==fp)
{
printf("Cannotopenthisfile!
\n");
exit(0);
}
fwrite(stu,sizeof(STUDENT),sizeof(stu)/sizeof(STUDENT),fp);rewind(fp);/*文件指针重新回到头*/
fseek(fp,sizeof(STUDENT),SEEK_SET);/*定位,此处跳过一条记录*/fread(&stu2,sizeof(STUDENT),1,fp);/*从文件中读取指定大小的块*/printf("%s-->%s-->%lf\n",stu2.sNo,stu2.sName,stu2.score);
fclose(fp);
}
4.xx操作文本文件:
函数原型:
intfprintf(FILE*fp,constchar*format[,argument,…])
intfscanf(FILE*fp,constchar*format[,address,…])
功能:
按格式对文件进行读写操作。
二进制的文件不要用,而改用fread和fwrite。
fprintf:
输出列表中的各项数据按指定的格式写入到fp指向的文件中fscanf:
从fp所指向的文件中按指定的格式读取数据依次存放到输出列表中的各项。
返回值:
成功,返回读写的个数;出错或文件尾,返回EOF(-1),eg:
fprintf(fp,“%d,%6.2f”,i,t);//将i和t按%d,%6.2f格式输出到fp文件fscanf(fp,“%d,%f”,&i,&t);//若文件中有3,4.5,则将3送入i,4.5送入t
示例:
#include
#include
voidmain()
{
inta=5,b;
doublex=3.5,y;
charszText[20]="HelloWorld!
",szNewText[20];
FILE*fp=fopen("d:
\\c.txt","w+");
if(fp==NULL)
{
printf("Cannotopenthisfile!
\n");
exit(0);
}
fprintf(fp,"%d%lf%s\n",a,x,szText);
rewind(fp);
fscanf(fp,"%d%lf%s\n",&b,&y,szNewText);
printf("%d---%lf---%s\n",b,y,szNewText);
fclose(fp);
}
5.rewind函数
函数原型:
voidrewind(FILE*fp)
功能:
重置文件位置指针到文件开头
返回值:
无
6.fseek函数
函数原型:
intfseek(FILE*fp,longoffset,intwhence)
功能:
文件随机定位函数,改变文件位置指针的位置。
一般用于二进制文件。
返回值:
成功,返回0;失败,返回非0值
Eg:
fseek(fp,100L,0);
fseek(fp,50L,1);
fseek(fp,-10L,2);
第2个参数offset表示相对whence为基点的偏移字节数,要求是长整型数据,可以是正整数(向文件尾方向移动)、0(不移动)、负整数(向文件头方向移动)。
第3个参数可以用如下的宏替换:
n文件开始SEEK_SET0
n文件当前位置SEEK_CUR1
n文件末尾SEEK_END2
7.ftell函数
函数原型:
longftell(FILE*fp)
功能:
返回位置指针当前位置(用相对文件开头的位移量表示)
返回值:
成功,返回当前位置指针位置(长整型);失败,返回-1L,
可以利用fseek和ftell函数实现求文件的元素个数。
如下:
#include
usingnamespacestd;
intmain()
{
}FILE*fp1=fopen("c:
\\a.txt","w");
if(NULL==fp1)
{
cout<<"Cannotopenthisfile!
"<exit(0);
}
charc='\0';
while((c=getchar())!
='#')
{
fputc(c,fp1);
}
fseek(fp1,0L,2);//定位到文件末尾
cout<fclose(fp1);
return0;
8.ferror函数
函数原型:
intferror(FILE*fp)
功能:
测试文件是否出现错误
返回值:
未出错,0;出错,非0
说明:
每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试fopen打开文件时,ferror函数初值自动置为0
9.remove函数
函数原型:
intremove(char*path)
功能:
删除指定路径的文件
返回值:
成功删除,0;否则,-1
举例:
如下
#include
voidmain()
{
if(-1==remove("d:
\\c.txt"))//删除d盘下的c.txt
{
printf("removefailed!
\n");
}
}
10.clearerr函数
函数原型:
voidclearerr(FILE*fp)
功能:
使文件错误标志置为0
返回值:
无
说明:
出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数
举例:
如下
#include
intmain(void)
{
FILE*fp=fopen("abc.txt","w");
getc(fp);//此时没有内容,读取失败
if(ferror(fp))
{
printf("Errorreadingfromabc.txt\n");
clearerr(fp);//清除错误标志
}
if(!
ferror(fp))
printf("Errorindicatorcleared!
\n");
fclose(fp);
return0;
}
11.系统自动打开和关闭三个标准文件:
标准输入------------键盘stdin
标准输出------------显示器stdout
标准出错输出------显示器stderr