C语言基本文件编程操作(读写)

举报
DS小龙哥 发表于 2022/02/28 09:34:52 2022/02/28
【摘要】 文件编程也是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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。