C语言 文件指针的简单使用

目录

一:r+ 文件操作

二:w+ 文件操作

三:文件的打开

四:文件的写入


一:r+ 文件操作

r+可以打开一个存在的文件,示例如下:

#include<stdio.h>
#include<windows.h>  //exit(0)

int main()
{
	FILE *pf=NULL;  //文件指针
	pf = fopen("menu.txt","r+");
	//r+  打开一个存在的文件
	if(pf==NULL)
	{
		printf("open fail\n");//open fail
		exit(0);	
	}
    return 0;
}

二:w+ 文件操作

w+文件不存在 则会创建文件

         文件存在 则覆盖掉 原有文件

w+ 打开文件操作示例如下:

#include<stdio.h>
#include<windows.h>  //exit(0)

int main()
{
	FILE *pf=NULL;  //文件指针
	pf = fopen("menu.txt","w+");
	//w+ 文件不存在会创建文件 文件存在:覆盖掉
	if(pf==NULL)
	{
		printf("open fail\n");//Press any key to continue 会创建文件
		exit(0);	
	}
	return 0;
}

三:文件的打开

CFile.h

#ifndef CFILE_H
#define CFILE_H
#include<stdio.h> // 用到FILE结构体

//保证打开一个文件  char name[20] char name[ ] char* name
FILE *f_open(char *name);

#endif

CFile.c

#include"CFile.h"

//保证打开一个文件  
FILE *f_open(char *name)
{
	FILE *fp = NULL;
	fp = fopen(name,"r+");
	if(fp==NULL)  //不存在
	{
		fp = fopen(name,"w+"); //就创建			
	}
}

main.c 做多个测试

main.c 

w+ 若是文件不存在则会创建文件 【但要确认文件夹存在】如下默认创建文件于工程目录下

#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

int main()
{
	FILE *pf=NULL;  //文件指针
	pf = f_open("menu.txt");  //结果 open success,文件所在地址:0042AAE8
    // w+ 文件不存在创建文件 但要确认文件夹存在  
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);//open success,文件所在地址:0042AAE8	
	}
	return 0;
}

main.c  

文件不存在创建文件 但要确认文件夹存在,否则文件路径出错,无法打开文件 

如下示例中由于工程目录下并没有创建data文件夹,data文件夹不存在,则打开文件失败

#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

int main()
{
	FILE *pf=NULL;  //文件指针
	pf = f_open("data/menu.txt"); //结果 open fail
    // w+ 文件不存在创建文件 但要确认文件夹存在  
	if(pf==NULL)
	{
		printf("open fail\n");//open fail
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);	
	}
	return 0;
}

解决:自己在工程目录下创建data文件夹

main.c 

文件不存在则会创建文件 但要确认文件夹存在,确保文件路径无误,才可打开文件

如下示例中 D盘存在,则文件打开成功

#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

int main()
{
	FILE *pf=NULL;  //文件指针
	pf = f_open("D:/menu.txt"); // 结果open success,文件所在地址:0042AAE8
    // w+ 文件不存在创建文件 但要确认文件夹存在  
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);//open success,文件所在地址:0042AAE8	
	}
	return 0;
}

四:文件的写入

main.c 

打开文件并写入文件

如下,光标定位文件末尾,写入一个结构体数据于文件中

#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

typedef struct menu_t//定义菜谱结构体
{
	int id;
	char name[20];
	double price;
}MENU_T;

int main()
{
	FILE *pf=NULL;  //文件指针
	MENU_T menu = {1001,"水煮鱼",59.8};//定义结构体
   
	// w+ 文件不存在创建文件 但要确认文件夹存在
     pf = f_open("D:/menu.txt"); // 结果 open success,文件所在地址:0042AAE8
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);	
	}

	//光标定位在文件末尾
	fseek(pf,0,SEEK_END);
    //1.写入内容的地址 2.写入的大小 3.几块 4.文件指针
    fwrite(&menu,sizeof(MENU_T),1,pf);
	fclose(pf);
	return 0;
}

main.c 

再写入 menu1 至文件中

如下,光标定位于文件末尾,再写入一个结构体数据于文件中

#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

typedef struct menu_t
{
	int id;
	char name[20];
	double price;
}MENU_T;

int main()
{
	FILE *pf=NULL;  //文件指针
	MENU_T menu = {1001,"水煮鱼",59.8};
	MENU_T menu1 = {1002,"水煮肉片",59.8};

    // w+ 文件不存在创建文件 但要确认文件夹存在
     pf = f_open("D:/menu.txt"); // 结果open success,文件所在地址:0042AAE8
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);	
	}
	//光标定位在文件末尾
	fseek(pf,0,SEEK_END);
    //1.写入内容的地址 2.写入的大小 3.几块 4.文件指针
    fwrite(&menu1,sizeof(MENU_T),1,pf);
	fclose(pf);
	return 0;
}

 

mian.c

若定位文件开头写入文件则原数据会被覆盖 

如下,光标定位于文件开头,写入内容至文件则会覆盖文件原来内容的开头部分内容

fseek(pf,0,SEEK_SET);
#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

typedef struct menu_t
{
	int id;
	char name[20];
	double price;
}MENU_T;

int main()
{
	FILE *pf=NULL;  //文件指针
	MENU_T menu = {1001,"水煮鱼",59.8};
	MENU_T menu1 = {1002,"水煮肉片",59.8};
	MENU_T menu2 = {1003,"水煮田鸡",59.8};
   
	// w+ 文件不存在创建文件 但要确认文件夹存在
     pf = f_open("D:/menu.txt"); // 结果open success,文件所在地址:0042AAE8
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);	
	}
	//光标定位在文件开始
	fseek(pf,0,SEEK_SET);
    //1.写入内容的地址 2.写入的大小 3.几块 4.文件指针
    fwrite(&menu2,sizeof(MENU_T),1,pf);
	fclose(pf);
	return 0;
}

 

main.c 

通过偏移量,使原数据不被覆盖

如下,知道文件中数据量[2],通过指针偏移方式,光标定位开头再偏移,写入数据至文件,才不会被覆盖

fseek(pf,2*sizeof(MENU_T),SEEK_SET);
#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

typedef struct menu_t
{
	int id;
	char name[20];
	double price;
}MENU_T;

int main()
{
	FILE *pf=NULL;  //文件指针
	MENU_T menu = {1001,"水煮鱼",59.8};
	MENU_T menu1 = {1002,"水煮肉片",59.8};
	MENU_T menu2 = {1003,"水煮田鸡",59.8};

    // w+ 文件不存在创建文件 但要确认文件夹存在
     pf = f_open("D:/menu.txt"); // 结果open success,文件所在地址:0042AAE8
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);	
	}
	//光标定位在文件开始 偏移量  +向右偏移 -向左偏移
	fseek(pf,2*sizeof(MENU_T),SEEK_SET);
    //1.写入内容的地址 2.写入的大小 3.几块 4.文件指针
    fwrite(&menu,sizeof(MENU_T),1,pf);
	fclose(pf);
	return 0;
}

 

main.c

再写入一个不覆盖结构体数据至文件中

如下,知道文件中数据量[3],通过指针偏移方式,光标定位开头再偏移,写入数据至文件,才不会被覆盖

 fseek(pf,3*sizeof(MENU_T),SEEK_SET); 
#include<stdio.h>
#include<windows.h>  //exit(0)
#include"CFile.h"

typedef struct menu_t
{
	int id;
	char name[20];
	double price;
}MENU_T;

int main()
{
	FILE *pf=NULL;  //文件指针
	MENU_T menu = {1001,"水煮鱼",59.8};
	MENU_T menu1 = {1002,"水煮肉片",59.8};
	MENU_T menu2 = {1003,"水煮田鸡",59.8};
    MENU_T menu3 = {1004,"水煮1",59.8};

    // w+ 文件不存在创建文件 但要确认文件夹存在
     pf = f_open("D:/menu.txt"); // 结果open success,文件所在地址:0042AAE8
	if(pf==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}
	else
	{
		printf("open success,文件所在地址:%p\n",pf);	
	}
	//光标定位在文件开始 偏移量  +向右偏移 -向左偏移
	fseek(pf,3*sizeof(MENU_T),SEEK_SET);
    //1.写入内容的地址 2.写入的大小 3.几块 4.文件指针
    fwrite(&menu3,sizeof(MENU_T),1,pf);
	fclose(pf);
	return 0;
}

深入学习,文件指针,可以参考下面文章

文件指针 基础

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值