【C语言】文件处理函数全集(最全)-人间有格

    技术2026-01-03  12

    20200704@C语言学习第12天 本文属于汇编整理,参考了MOOC北京理工大学公开课的框架,另外整理了一些相关资料,觉得有用的朋友可以点赞支持一下

    一、文件的顺序读写的

    代码1

    #include<stdio.h> #define SIZE 3 struct student /* 定义结构 */ { long num; char name[10]; int age; char address[10]; } stu[SIZE], out; void fsave ( ); main ( ) { FILE *fp; int i; for ( i=0; i<SIZE; i++ ) /* 从键盘读入学生的信息(结构) */ { printf("Input student %d:", i+1); scanf("%ld%s%d%s",&stu[i].num,stu[i].name,&stu[i].age,stu[i].address); } fsave( ); /* 调用函数保存学生信息 */ fp = fopen ("d:\\student", "rb"); /* 以二进制读方式打开数据文件 */ printf (" No. Name Age Address\n"); while ( fread(&out, sizeof(out),1,fp) ) /*以读数据块方式读入信息 */ printf("%8ld %-10s %4d %-10s\n",out.num,out.name,out.age,out.address); fclose(fp); /* 关闭文件 */ } void fsave ( ) { FILE *fp; int i; if((fp=fopen("d:\\student","wb"))==NULL) /* 二进制写方式 */ { printf ("Cannot open file.\n"); return; } for(i=0; i<SIZE; i++ ) /*将结构以数据块形式写入文件 */ if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("File write error.\n"); /* 出错处理 */ fclose (fp); /* 关闭文件 */ }

    (1)fread和fwrite fread和fwrite是很重要的文件操作函数。下面是它的原型:

    代码 2

    size_t fread(void *buf, size_t size, size_t count, FILE *fp); size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);

    在上面的 fread 和 fwrite 函数原型中: 参数 size 是指单个元素的大小(其单位是字节而不是位,例如,读取一个 int 型数据就是 4 字节);参数 count 指出要读或写的元素个数,这些元素在 buf 所指的内存空间中连续存放,共占“sizecount”个字节。即 fread 函数从文件 fp 中读出“sizecount”个字节保存到 buf 中,而 fwrite 把 buf 中的“size*count”个字节写到文件 fp 中。最后,函数 fread 和 fwrite 的返回值为读或写的记录数,成功时返回的记录数等于 count 参数,出错或读到文件末尾时返回的记录数小于 count,也可能返回 0。[1]

    (2)fopen、fgets与fputs

    代码 3

    #include <stdio.h> #include <stdlib.h> #define N 100 int main() { FILE *fp; char str[N + 1]; //判断文件是否打开失败 if ( (fp = fopen("d:\\demo.txt", "rt")) == NULL ) { puts("Fail to open file!"); exit(0); } //循环读取文件的每一行数据 while( fgets(str, N, fp) != NULL ) { printf("%s", str); } //操作结束后关闭文件 fclose(fp); return 0; }

    fopen就是读文件,把文件放到程序中。需要注意的是打开的是字符型的还是二进制型的,“w”,“r”,"a"用于操作文本文件,后面加t意思一样,“wb”,“rb”,"ab"用于操作二进制文件,“+”表示允许读和写。

    fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加’\0’,并以str作为函数值返回。[2]

    fputs函数向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数;否则返回EOF(符号常量,其值为-1)。

    代码 4

    #include<stdio.h> #include<stdlib.h> #include<string.h> main( ) { FILE *fp; char str[81], filename[80]; gets(filename); if((fp=fopen(filename,"w"))==NULL) { printf("can not open this file\n"); exit(0); } while(strlen(gets(str))>0 ) { fputs(str,fp); fputs("\n",fp); } fclose(fp); }

    (3)fgetc,fputc,getc,putc

    fgetc()函数的功能是从文件指针指定的文件中读入一个字符,该字符的ASCII值作为函数的返回值,若返回值为EOF,说明文件结束,EOF是文件结束标志,值为-1。语句“c=fgetc(fp);”是从文件指针fp指定的文件中读一个字符并存人c变量中,c是字符型变量。使用fgetc()函数调用前,需要读取的文件必须是以读或读/写方式打开的,并且该文件应该已经存在。 代码 5

    #include <string.h>  #include <stdio.h>  #include <conio.h>  int main(void)  { FILE *stream; char string[ ] = "This is a test"; int ch;  /* open a file for update */ stream = fopen("DUMMY.FIL", "w+");  /* write a string into the file */ fwrite(string, strlen(string), 1, stream);  /* seek to the beginning of the file */ fseek(stream, 0, SEEK_SET); do { /* read a char from the file */ ch = fgetc(stream); /* display the character */ putch(ch); } while (ch != EOF); fclose(stream); return 0; }

    fputc,是函数。函数功能: 将字符c写到文件指针fp所指向的文件的当前写指针的位置。函数格式:int fputc (int c, FILE *fp)。在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。EOF是在头文件 stdio.h中定义的宏。

    #include <stdio.h> #include <stdlib.h> void main() { FILE*fpout; char ch; if((fpout=fopen("file_a.dat","w"))==NULL) { printf("Error!\n"); exit; } ch=getchar(); for(;ch!='#';) { fputc(ch,fpout); ch=getchar();//不能仅写getchar(); } fclose(fpout); }

    二、文件的随机读写

    (1)fseek fseek用于定义指针的位置,也可以用来计算文件的长度,如下面这段程序。

    代码5

    fseek(fp, 0, 2); i=ftell(fp); printf("i=%ld\n", i);

    fseek(fp,100L,0);把stream指针移动到离文件开头100字节处; fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处; fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。[3]

    (2)ftell和frewind ftell是用来读取当前指针位置的,当然向(3)中给的例子那样也可以用来读取字符串长度。在百科上看到一个有趣的例子,ftell也可以用来读取文本文件中的内容[4]

    代码 6

    #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; int flen; /* 这里也可以定义成long,用于读取更长的文件 */ char *p; /* 以只读方式打开文件 */ if((fp = fopen ("1.txt","r"))==NULL) { printf("\nfile open error\n"); exit(0); } fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */ flen=ftell(fp); /* 得到文件大小 */ p=(char *)malloc(flen+1); /* 根据文件大小动态分配内存空间 */ if(p==NULL) { fclose(fp); return 0; } fseek(fp,0L,SEEK_SET); /* 定位到文件开头 */ fread(p,flen,1,fp); /* 一次性读取全部文件内容 */ p[flen]='\0'; /* 字符串结束标志 */ printf("%s",p); fclose(fp); free(p); return 0; }

    frewind就是把当前文件指针移动到文件开始。除了frewind还有很多方法指针都会定位在文件开始,如下:

    代码 7

    fopen(fname,fp,"r+") fseek(fp,0,0)

    三、文件检测

    (1)feof 检查文件读写过程是否结束。是:1,否:0. feof与EOF的区别https://blog.51cto.com/bbchylml1988/690425 (2)ferror 检查文件在读或者写的过程中是否出错。是:1,否:0. 源码https://book.51cto.com/art/201701/528138.htm (3)clearerr 清除文件中的错误和结束标记。 源码https://book.51cto.com/art/201701/528139.htm

    参考文献: [1] http://c.biancheng.net/view/399.html [2]fopen函数详细解析http://c.biancheng.net/view/2054.html [3]fseek百度百科https://baike.baidu.com/item/fseek/10942382?fr=aladdin [4]ftell百度百科https://baike.baidu.com/item/ftell/10942394?fr=aladdin [5]本文中代码1,4,5,7来源于MOOC北京理工大学公开课 [6]getc等https://baike.baidu.com/item/fputc/10942337?fr=aladdin

    Processed: 0.036, SQL: 9