当前位置:文档之家› c语言教学资料:c语言文件操作常用函数详解.docx

c语言教学资料:c语言文件操作常用函数详解.docx

c语言教学资料:c语言文件操作常用函数详解.docx
c语言教学资料:c语言文件操作常用函数详解.docx

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

相关主题
文本预览
相关文档 最新文档