C语言文件操作详解
在C语言文件操作的过程中,通常有以下几种方式:
1.单个字符的操作:
fputc 函数原型:int fputc(int c, FILE *fp);
功能:把一字节代码c写入fp指向的文件屮
返回值:正常,返回C;出错,为EOF(-l)
fgetc
函数原型:int fgetc(FILE *fp);
功能:从fp指向的文件中读取一字节代码
返回值:正常,返回读到的代码值;读到文件尾或出错,为EOF(-l) feof
函数原型:int feof(FILE *fp);
功能:判断文件是否到末尾
返回值:文件未结束,返回0;文件结束,返回真(非())
示例:
# include
#include
void main()
{
char ch;
FILE *fpl = fopenC'diWa.daf, H wb M); /* 以写的方式打开二进制文件 */ if(NULL ==fpl)
{
printf("Can not open this file!\n M); exit(0);
1
printf("please input a string:");
ch = getchar();
while(ch匸#) /*输入#号结束*/
{
fputc(ch, fpl); /*依次向文件中写*/
ch = getchar();
}
fflush(stdin); /*清空输入缓冲区*/ fclose(fpl); /* 关闭文件 */
FILE *fp2 二fopen(”d:\\a.dat”, “rb”);/* 以读的方式打开二进制文件 */ if(NULL = fp2)
printf("Can not open this file!\n M); exit(O);
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)贝U 是fputc(c,stdout) getchar()则是fgetc(stdin)
2.对字符串的操作:
char *fgets(char *s, int n, FILE *fp)
int fputs(char *s, FILE *fp)
功能:
fgets:从fp指向的文件中读一个长度为n的字符串,保存到s中。其中char* s要是已经有内存空间的,通常是用数组定义的,或者用char*则要用malloc分配内存。
fputs:向fp所指向的文件中写入字符串S。
返回值:
fgets:正常时返回读取字符串的首地址;出错或文件尾,返回NULL fputs:正常时返回写入的最后一个字符;出错为EOF (-1)
示例:
#include
#include
#include
void main()
{
FILE *fp;
char string[100];
if((fp = fopen("file.txt H, ”w”))== NULL)
{
printf("cann't open this file!\n"); exit(O);
}
while(strlen(gets(string)) > 0) /*从键盘输入字符串,回车停止*/
{
fputs(string, fp); /*将字符串写入文件*/
fputs("\n", fp); /* 在最后加上一个'\n'*/
fclose(fp);
if((fp = fopen("file.txt'V'r")) == NULL)
{
printfC^annl open this file!\n u);
exit(O);
I
while(fgets(string, 10, fp) != NULL) /* 判断是否到达文件末尾 */
fputs(string, stdout); /* 等价于puts(string); */
fclose(fp);
}
3.对二进制形式的块读写:
函数原型:
size_t fread(void *buffer,size_t size, size_t count, FILE *fp);
size_t fwrite(void *buffer,size_t size, size_t count, FILE *fp);
功能:读/写数据块fread与fwrite —般用于二进制文件的输入/输出
fread:从fp所指向的文件中读取count个块,每个块的长度为size个字节,存放到以buffer为首地址的内存中。其中buffer必须已经是有内存空间的。
fwrite:从以buffer为首地址的内存中读取count个块,每个块的长度为size个字节,写入到fp所指向的文件中。
返回值:成功,返回读/写的块数;出错或文件尾,返冋0
说明:
buffer: 指向要输入/输出数据块的首地址的指针
size: 读/写的数据块的大小(字节数)
count: 要读/写的数据块的个数
fp: 要读/写的文件指针
示例:
#inelude
#include
typedef struct STUDENT
char sNo[5];
char sName[20];
double score;
{STUDENT;
void main()
{
/*只对单个的时候*/
// int x = 19;
// int y = 0;
// FILE * fp = fopen(,'d:\\a.dat,,?” wb“);
// if(NULL == fp)
//
// }
// fwrite(&x, sizeof(x), 1, fp);
// fclose(fp);
//
// fp = fopcn(”d:\\a.dal”,”rb”);
// if(NULL == fp)
// {
// printf(u Can not open this file!\n M);
// exit(O);
// }
// fread(&y, sizeof(y), 1, fp);
// printf(n%d\n H, y);
// fclose(fp);
/*对于块的时候*/
// intx[] = {l,2,3,4,5,6,7,8,9};
// int y[9] = {0};
// int i;
// FILE* fp = fopenC'drWa.txf, “wb”);
// if(NULL == fp)
// {
// printf("Can not open this file!\n M);
// exit(O);
// }
// fwrite(x, sizeof(int), sizeof(x)/sizeof(inl), fp); // fclose(fp);
//
// fp = fopen(“d:\\a.txF', n rb H);
// if(NULL == fp)
// {
// printf("Can not open this file!\n");
// exit(0);
// }
// fread(y, sizeof(int), sizeof(y)/sizeof(int), fp); // for(i = 0; i < 9; i++)
// {
// printf(u%d ”, y[i]);
// }
// printf(,,\n u);
// fclose(fp);
/*操作一块*/
STUDENT stu[3] = {
“0001”,”赵军”,89,
“0002”,”李千”,90,
“0003”, ”张芳”,100
};
STUDENT stu2;
FILE* fp = fopen(H d:\\b.txt M, ”wb+”);
if(NULL == fp)
{
printf(u Can not open this file!\n M);
exit(0);
}
fwrite(stu, sizeof(STUDENT), sizeof(stu)/sizeof(STUDENT), fp);
rewind(fp); /*文件指针重新回到头*/
fseek(fp, sizeof(STUDENT), SEEK_SET);/* 定位,此处跳过一条记录 */
fread(&stu2,sizeof(STUDENT), l,fp);/* 从文件中读取指定大小的块 */
printf("%s—>%s—>%lf\n", stu2.sNo, stu2.sName, stu2.score);
fclose(fp);
1
4.格式化操作文本文件:
函数原型:
int fprintf(FILE *fp,const char *format[,argument,? ? ?])
int fscanf(FILE *fp,const char address,…])
功能:按格式对文件进行读写操作。二进制的文件不要用,而改用fread和fwrite o fprintf:输出列表中的各项数据按指定的格式写入到fp指向的文件中fscanf:从fp所指向的
文件中按指定的格式读収数据依次存放到输出列表中的各项。
返回值:成功,返回读写的个数;出错或文件尾,返回EOF (-1), eg: fprintf(fp, “%d,%6.2f”,i,t); 〃将i 和(按%d,%6.2f 格式输出到fp 文件fscanf(fp, “%d,%f”,&i,&t); 〃若文
件中有3,4.5 ,则将3 送入i, 4.5 送入t
示例:
#include
#include
void main()
{
int a = 5, b;
double x = 3.5, y;
char szText(20] = ''HelioWorld!M, szNewTextf20J;
FILE* fp = fopen(u d:\\c.txt n, “w+”);
if(fp == NULL)
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 函数
函数原型: void rewind(FILE *fp) 功能:重置文件位置指针到文件开头 返回值:无
6. fseek 函数
函数原型:int fseek(F!LE *fp,long offset,int whence)
功能:文件随机定位函数,改变文件位置指针的位置。一般用于二进制文件。 返回值:成功,返回0;失败,返回非0值
Eg: fseek(fp,100L,0);
fseek(fp,50L,l);
fseek(fp,-10L,2);
第2个参数offset 表示相对whence 为基点的偏移字节数,要求是长整型数据,可以是正整 数(向文件尾方向移动)、0 (不移动)、负整数(向文件头方向移动)。
第3个参数可以用如下的宏替换:
■文件开始
■文件当前位置
■文件末尾
7. ftell 函数
函数原型:long ftell(FILE *fp)
功能:返冋位置指针当前位置(用相对文件开头的位移量表示)
返回值:成功,返回当前位置指针位置(长整型);失败,返回?1L, 可以利用fseek 和ftell 函数实现求文件的元素个数。如下:
#include
using namespace std;
int main()
{
FILE* fpl = fopen(M c:\\a.txt", "w"); if(NULL ==fpl)
}
char c = '\0*; SEEK.SET SEEK_CUR SEEK END
while((c = getchar()) != *#')
{
fputc(c, fpl);
fseek(fpl, OL, 2); 〃定位到文件末尾
cout ? ftell(fpl) ? endl; 〃告诉当前文件指针的位置
fclose(fpl);
return 0;
1
8.ferror 函数
函数原型:int ferror(FILE *fp)
功能:测试文件是否出现错误
返回值:未出错,0;出错,非0
说明:
每次调用文件输入输出函数,均产生一个新的feiror函数值,所以应及时测试fopen
打开文件时,ferror函数初值自动置为0
9.remove 函数
函数原型:int remove(char* path)
功能:删除指定路径的文件
返回值:成功删除,0;否则,?1
举例:如下
# include
void main()
{
if(-l == remove(”d:\\c.txt“))〃删除d 盘下的c.txt
{
printf("remove failed!\n H);
}
}
10.clearerr 函数
函数原型:void clearerr(FILE *fp)
功能:使文件错误标志置为0
返回值:无
说明:出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数
举例:如下
#include
int main(void)
{
FILE *fp = fopen(,,abc.txt,,? "w"); getc(fp); 〃此时没有内容,读取失败让(ferror(fp))
{
printf("Error reading from abc.txt\n"); clearerr(fp); 〃清除错误标志
}
if(!ferror(fp))
printf("Error indicator cleared!\n");
fclose(fp);
return 0;
}
11.系统自动打开和关闭三个标准文件:
标准输入-------- 键盘stdin
标准输出-------- 显示器stdout
标准出错输出……显示器stderr