C语言基本文件编程操作(读写)
【摘要】 文件编程也是C语言里重要的一个知识点,在电脑上编程肯定是需要与文件、磁盘打交道的。C语言标准库里提供了文件编程接口,我们不需要理解磁盘原理、磁盘驱动、直接调用C语言提供的接口函数就可以读写磁盘上的文件
一、文件编程介绍
文件编程也是C语言里重要的一个知识点,在电脑上编程肯定是需要与文件、磁盘打交道的。
C语言标准库里提供了文件编程接口,我们不需要理解磁盘原理、磁盘驱动、直接调用C语言提供的接口函数就可以读写磁盘上的文件,非常方便。
一般的文件操作流程就是: 打开文件----读写文件-----关闭文件。
对应起来就是4个函数: fopen fread/fwrite fclose
下面就介绍如何使用这4个函数完成基本的文件操作。
在嵌入式开发、单片机开发里,也有很多现成的文件系统,提供的函数和C语言标准函数大同小异,操作流程没什么区别。
二、文件接口函数介绍
2.1 打开、读、写、关闭函数原型
这4个函数是最基本的函数,只用这4个已经可以完成大部分文件编程需求了。
#include <stdio.h>
//打开文件
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)