一、文件编程介绍
文件编程也是C语言里重要的一个知识点,在电脑上编程肯定是需要与文件、磁盘打交道的。
C语言标准库里提供了文件编程接口,我们不需要理解磁盘原理、磁盘驱动、直接调用C语言提供的接口函数就可以读写磁盘上的文件,非常方便。
一般的文件操作流程就是: 打开文件----读写文件-----关闭文件。
对应起来就是4个函数: fopen fread/fwrite fclose
下面就介绍如何使用这4个函数完成基本的文件操作。
在嵌入式开发、单片机开发里,也有很多现成的文件系统,提供的函数和C语言标准函数大同小异,操作流程没什么区别。
二、文件接口函数介绍
2.1 打开、读、写、关闭函数原型
这4个函数是最基本的函数,只用这4个已经可以完成大部分文件编程需求了。
#include //打开文件 FILE *fopen(const char *path, const char *mode); //读文件 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); //写文件 size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); //关闭文件 int fclose(FILE *fp);
2.2 写函数的基本运用
下面的示例代码演示了如何向文件追加写数据。
#include #include #include int main() { FILE *file; int cnt; /*1. 打开文件*/ file=fopen("D:/123.txt","a+b"); if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 写数据*/ cnt=fwrite("1234567890",1,10,file); /*3. 关闭文件*/ fclose(file); printf("cnt=%d\n",cnt); return 0; }
2.3 读函数基本运用
打开指定文件,读取100字节内容打印出来。
#include #include #include int main() { FILE *file; int cnt; char buff[100]; /*1. 打开文件*/ file=fopen("D:/123.txt","rb"); //malloc if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 写数据*/ cnt=fread(buff,1,100,file); /*3. 关闭文件*/ fclose(file); //free buff[cnt]='\0'; printf("%s\n",buff); printf("cnt=%d\n",cnt); return 0; }
2.4 文件指针位置偏移 (自动向后偏移)
对文件读写时,文件内部有一个文件指针记录当前文件读写的位置,可以理解为在电脑上编辑代码文档时看到的光标一样,读写时会自动偏移。
int main() { FILE *file; int cnt; char data; /*1. 打开文件*/ file=fopen("D:/123.txt","rb"); //malloc if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 读数据---验证文件指针是否可否自动向后偏移*/ cnt=fread(&data,1,1,file); printf("data=%c\n",data); cnt=fread(&data,1,1,file); printf("data=%c\n",data); cnt=fread(&data,1,1,file); printf("data=%c\n",data); cnt=fread(&data,1,1,file); printf("data=%c\n",data); cnt=fread(&data,1,1,file); printf("data=%c\n",data); /*3. 关闭文件*/ fclose(file); //free return 0; }
2.5 设置文件指针位置
如果想要从指定位置读取文件,可以调用fseek函数定位文件指针的位置。
#include #include #include int main() { FILE *file; int cnt; char data; /*1. 打开文件*/ file=fopen("D:/123.txt","rb"); //malloc if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 偏移文件指针*/ fseek(file,5,SEEK_SET); /*3. 读数据---验证文件指针是否可否自动向后偏移*/ cnt=fread(&data,1,1,file); printf("data=%c\n",data); /*4. 关闭文件*/ fclose(file); //free return 0; }
2.6 判断文件读取完毕
如果要读取全部文件内容,肯定需要知道文件什么 时候读取完毕。最常见的判断方法就是判断read函数的返回值,是否与想要读取的字节数相等,不相等要么读取完毕了要么就是失败了。
#include #include #include int main() { FILE *file; int cnt; char data; /*1. 打开文件*/ file=fopen("D:/123.txt","rb"); //malloc if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 偏移文件指针*/ fseek(file,5,SEEK_SET); /*3. 读数据---验证文件指针是否可否自动向后偏移*/ while(1) { cnt=fread(&data,1,1,file); if(cnt!=1)break; printf("data=%c\n",data); } /*4. 关闭文件*/ fclose(file); //free return 0; }
2.7 使用文件操作函数读写结构体数据
文件是一个存储数据的空间,不仅仅可以存储文本数据,也可以存储我们指定的二进制数据。
向文件里写入数据之后,只要自己知道格式,读取的时候按照约定的格式读取出来解析就行。
比如: 软件每次启动时,可以读取上次保存的配置文件。
//写结构体数据 #include #include #include struct MyStruct { int a; int b; char c[100]; }; int main() { FILE *file; int cnt; struct MyStruct stu={666,888,"C语言文件操作学习"}; /*1. 打开文件*/ file=fopen("D:/123.txt","wb"); if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 读数据*/ cnt=fwrite(&stu,1,sizeof(struct MyStruct),file); printf("cnt=%d\n",cnt); /*3. 关闭文件*/ fclose(file); //free return 0; } //读结构体数据 #include #include #include struct MyStruct { int a; int b; char c[100]; }; int main() { FILE *file; int cnt; struct MyStruct stu; /*1. 打开文件*/ file=fopen("D:/123.txt","rb"); if(file==NULL) { printf("文件打开失败!\n"); return -1; } /*2. 读数据*/ cnt=fread(&stu,1,sizeof(struct MyStruct),file); printf("cnt=%d\n",cnt); printf("%d,%d,%s\n",stu.a,stu.b,stu.c); /*3. 关闭文件*/ fclose(file); //free return 0; }
C 语言
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。