目录
一: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;
}
再写入 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;
}
深入学习,文件指针,可以参考下面文章