(1)fopen:打开文件
形式:FILE* fopen(const char * filename , const char* mode)
即:FILE* fp=NULL;
fp=fopen(文件名,文件打开方式);
如:fopen(“E:\\a.txt”,“r”); // 注:“\\”代表转义字符,表示一个反斜杠
mode对应的功能:
a.“r”:打开一个文本文件,只能读,如果文件不存在或无法找到,fopen函数失败,返回NULL;
b.“w”:创建一个文本文件,只能写,若文件存在则被重写;
c.“a”:打开一个文本文件,只能在文件尾部添加,如果文件不存在或无法找到,则新建一个文件;
d.“r+”:打开一个文本文件,可读可写,文件必须存在,否则,fopen函数失败,返回NULL;
e.“w+”:生成一个文本文件,可读可写,若文件存在则被重写;
f.“a+”:打开一个文本文件,可读可写,但只能在尾部添加,如果文件不存在,则新建一个文件。
注意:“a”和“a+”在对待文件尾标记EOF时,有细微不同,a模式不会将原文件的EOF移除,而a+模式会移除原文件中的EOF。
如:fp=fopen(“x.com”,“rb”);
表示以二进制文件只读方式打开当前目录下的x.com文件。
判断是否打开成功:
FILE* fp=NULL;
fopen(“E:\\a.txt”,“r”);
if(fp==NULL)
{出错处理;}
else
{正确处理;}
(2)fclose:关闭文件
形式: int fclose(FILE* fp);
注:使用该函数关闭时,缓冲区的数据都会被丢掉,可有效释放资源
(3)feof:判断文件已经结束
形式:int feof(FILE* fp);
对文本文件进行读取时,如果达到文件末尾,将返回EOF(-1),,对于二进制来说,-1是合法的数据,故一返回EOF就停止,则会出现错误,用feof函数,若位置指针到达尾,返回1,否则返回0.
(4)fgets和fputs:字符读写函数
形式:
int fgets(FILE* fpIn);
int fputs(int c, FILE* fpOut);
其中,fpIn必须是以读或读写方式打开的文件指针,fpOut必须是以读、读写或追加方式打开的文件指针。若读写操作正确,fgets函数返回写入字符的ASCII码,否则返回EOF。
(5)fgets和fputs:字符串读写函数
形式:
Char* fgets(char* str, int n, FILE* fpIn);
Int fputs(const char* str, FELE * fpOut);
例子:字符串输入输出函数
#include<stdio.h>
#include<conio.h>
void main(void)
{
char str[100],FileA[50];
FILE* fpO=NULL;
printf("请输入一串字符:\n");
gets(str);
printf("要将该字符串保存在什么地方?\n");
gets(FileA);
fpO=fopen(FileA,"wt");
if(fpO==NULL)
{
printf("输出文件打开失败,请检查");
exit(0);
}
if(fputs(str,fpO)==EOF)
{
printf("字符串写入失败");
exit(0);
}
fclose(fpO);
getch();
}
//huangd(键盘输入)
//E:\A.txt(键盘输入)
Fgets函数实例:
//fgets();从文件中读入字符串
#include<stdio.h>
#include<conio.h>
#include<string.h> //使用Strlen
void main(void)
{
char F[50]; //声明创建字符数组,用以保存文件位置
char str[100]={'0'}; //保存读入的字符串
FILE* fpI=NULL; //输出用
printf("要从哪个文件中读入字符串?\n");
gets(F);
fpI=fopen(F,"rt"); //只读方式打开F指定的文件
if(fpI==NULL) //防错
{
printf("输入文件打开失败,请检查");
exit();
}
if(fgets(str,sizeof(str),fpI)==NULL)
{
printf("字符串读出失败");
exit(0);
}
puts(str); //将str显示在屏幕上,等价于fputs(str,stdout)
fclose(fpI);
getch();
}
(6)fread和fwrite:块读写函数
分别 用于“从输入文件中读取一块数据到内存中”和“将内存中的一块数据写入到文件中”;
形式:
size_t fread(void *p, size_t size, size_t num, FILE* fpIn);
size_t fwrite(const void *p, size_t size, size_t num, FILE* fpOut);
例子:将一块内存数据写入文件中
#include<stdio.h>
#include<conio.h>
#define NUM 2
typedef struct
{
char name[20];
int age;
char email[50];
} person;
voidgetInfo(person* pInfo)
{
printf("请输入名字:");
gets(pInfo->name);
printf("请输入年龄:");
scanf("%d",&pInfo->age);
getchar();
printf("请输入电子邮件:");
gets(pInfo->email);
}
void main(void)
{
int i;
person People[NUM];
FILE* fpO=NULL;
char F[50];
printf("保存在哪个文件?\n");
gets(F);
fpO=fopen(F,"wt");
if(fpO==NULL)
{
printf("输出文件打开失败,请检查");
exit(0);
}
for(i=0;i<NUM;i++)
{
getInfo(&People[i]); //获取用户输入
//将当前person结构体变量占据的一块内存写入文件中
if(fwrite(&People[i],sizeof(person),1,fpO)==0)
{
printf("块写入失败");
exit(0);
}
}
printf("块写入成功");
fclose(fpO);
getch();
}
从文件中读一块数据到内存中:
#include<stdio.h>
#include<conio.h> //使用getch();
#define NUM 2
typedef struct //声明结构体person
{
char name[20];
int age;
char email[50];
}person;
void display(person p1) //显示人员信息的函数
{
printf("Name:%s\n",p1.name);
printf("Age:%d\n",p1.age);
printf("Email:%s\n",p1.email);
}
void main(void)
{
person People[NUM]; //声明结构体数组
FILE* fpI=NULL;
int i;
char FileA[50]; //声明创建字符数组,用以保存文件位置
printf("从哪个文件中读取数据?\n");
gets(FileA);
fpI=fopen(FileA,"rt"); //以文本只读方式打开FileA指定的文件
if(fpI==NULL) //防错处理
{
printf("输入文件打开失败,请检查");
exit(0);
}
for(i=0;i<NUM;i++)
{
if(fread(&People[i],sizeof(person),1,fpI)==0)//从文件中读取一块内存到People中
{
printf("块读取失败");
exit(0);
}
display(People[i]);
}
fclose(fpI);
getch();
}
//打开文件中内容要和person的定义一致,要不然会出现块读取失败
(7)fprintf和fscanf:格式化文件输入输出
“读写对象是磁盘文件而不是键盘和显示器”
形式:
Int fprintf(FILE* const char *,…);
Int fscanf(FILE* const char *,…);
例子:格式化文件输出实例fprintf
//在E:\A.txt 中写入姓名和年龄
#include<stdio.h>
#include<conio.h>
void main(void)
{
char FileA[50];
FILE* fpO=NULL;
char name[20];
int age=0;
printf("保存在哪个文件?\n");
gets(FileA);
fpO=fopen(FileA,"wt");
if(fpO==NULL)
{
printf("输出文件打开失败,请检查");
exit(0);
}
printf("请输入你的姓名:");
gets(name);
printf("请输入年龄");
scanf("%d",&age);
getchar();
if(fprintf(fpO," %s%d",name,age)==EOF)
{
printf("写入失败");
exit(0);
}
printf("写入成功");
fclose(fpO);
getch();
}
从文件中进行格式化输入:
#include<stdio.h>
#include<conio.h>
void main(void)
{
char FileA[50];
FILE* fpI=NULL;
char name[20]={'0'};
int age=0;
printf("从哪个文件中读取");
gets(FileA);
fpI=fopen(FileA,"rt");
if(fpI==NULL)
{
printf("输入文件打开失败....");
exit(0);
}
fscanf(fpI,"%s%d",name,&age);
printf("读取结果:姓名为%s,年龄为%d",name,age);
fclose(fpI);
getch();
}
(8)文件的定位
a. rewind:移到开头
形式:rewind(FILE* fp);
其没有返回值;
b. ftell:得到当前位置
形式:long ftell(FILE*);
执行成功,返回当前文件指针的值,否则返回-1L(L表示该-1为long型常量)
c. fseek:移动指针(重要)
用以控制、调整文件指针的值,从而改变下一次读写操作的位置;
形式:int fseek(FILE* fp, long offset, int startPos);
其中,fp是文件指针,startPos是起始点,offset是目标位置相对起始点的偏移量,可以为负数,如果成功,文件位置指针被设定为“起始点+offset”;
起始点设置有以下3种方式:
起始点 值 名称
文件开始 0 SEEK_SET
当前位置 1 SEEK_CUR
文件末尾 2 SEEK_END
注意:既可以使用0、1、2作参数传递给fseek函数,也可以使用名称;若执行正确,返回0…
例子://将字符串逆行输出
#include<stdio.h>
#include<conio.h>
void main(void)
{
FILE* fp=NULL;
int i;
fp=fopen("E:\\test.dat","wb");
if(fp==NULL)
{
printf("输出文件打开失败....");
exit(0);
}
fputs("Beijing",fp);
fclose(fp);
fp=fopen("E:\\test.dat","rb");
for(i=1;fseek(fp,-i,SEEK_END)==0;i++)
{
putchar(fgetc(fp));
}
fclose(fp);
getch();
}
(9)