1,文件:有限信息记录的集合。
eg: note.txt
2,文件存储:只能在存储在外存中
3,文件分类:
1,文本文件:文件中存放的字符(Byte)
2,二进制文件:存放的是二进制信息的文件
4,文件的路径:存放的位置
文件名:一个文件的标识
5,操作文件:
1,打开 例: FILE* fp = fopen(" ./data.c","rb");
注 : 打开失败,返回NULL;
2,操作 (读,写)
3,关闭
注 : 可能文件读写不成功
6,文本文件:文件中存放的字符
操作方式:
r 只读打开:如果文件不存在,则打开失败,否则以只读打开
w只写:如果文件不存在,则创建文件,否则截断为0(清空)再打开
r+读写打开
w+读写打开
a追加 a+
***文本文件的结束符:EOF
6.1写入:
fputc
fputs(char*,FILE*);
fprintf() 格式化输出;
本质: 1,(只能存储二进制)文本文件的信息存储就是二进制.
2,写入时:将字符转换ASCII码,存放,读取时再将ASCII转换为字符:EOF
6.2读取:以读r
1,打开文件fopen("路径","读"); //r /r
2,读取:
1,int fgetc(FILE*); 读取一个字符
2,fgets(char* buf,size,FILE); 读取一行
3,fscanf(FILE*,"format",...);//从文件中获取
3,关闭:fclose();
6.3 API:
1,获取文件的读写位置长度 : ftell()
2,修改文件的读写位置 : fseek();
int fseek(FILE *stream, long offset, int whence);
stream:文件
whence:文件的位置(SEEK_SET文件指针位置的头 当前位置SEEK_CUR SEEK_END文件的末尾)
offset:偏移量 (+后移 -前移)
3,判断文件是否完成:指向EOF
feof(); feof没有到末尾返回0 到了末尾就返回1 .
7,二进制:信息都是以二进制信息存放到文件中
操作文件步骤 :
1、打开 fopen("路径","操作方式");
操作方式 :
rb:以只读打开,如果文件不存在,则打开失败
rb+ 以读写打开,如果文件不存在,则打开失败
wb 以只写打开,如果文件不存在,则创建,否则截断
wb+ 以读写打开,如果文件不存在,则创建,否则截断
ab 读写以追加打开
ab+
2、操作(读,写)
fread(void* ptr, size_t size, size_t nmemb,
FILE *stream)
返回:读取的实际次数 size_t
fwrite(void* ptr, size_t size, size_t nmemb,
FILE *stream);
ptr:数据的首地址
size:一次写入的长度
nmemb:写入的次数
stream:文件
返回:写入的实际次数
3、关闭
fclose();
文本文件的操作 :
fputc ftell fseek fprintf 使用 :
#include<stdio.h>
struct msg
{
char name[10];
char sex;
int id;
float score;
};
void main()
{
//1打开test.txt 以只写打开
FILE* fp=fopen("./test.txt","w");
if(NULL==fp)
{
printf("文件打开失败\n");
return ;
}
//2操作
/*
fputc('a',fp);
fputc('b',fp);
fputc('c',fp);
//读取文件读写位置在那:
long ilen=ftell(fp);
printf("%d\n",ilen);
//位移
//fseek(fp,-3,SEEK_CUR);//从当前位置开始,向左偏移3个Byte
fseek(fp,0,SEEK_SET);//移动文件的开头
fputc('d',fp);
fputc('z',fp);
*/
//fputs("hello world\n",fp);
// int a=97;//将a写入到文件中,文件为100 1-0000001 '1'---01100001
// putc(a,fp);
// putc(a/100+48,fp);
// putc((a/10)%10+48,fp);
// putc(a%10+48,fp);
// fprintf(fp,"abcdef 100 %d %f",a,3.14);
//写入:
// struct msg lf={"lifei",'m',1001011,100};
// fprintf(fp,"name:%s sex:%c ID:%d score:%f\n",lf.name,lf.sex,lf.id,lf.score);
struct msg e[5]={...};
//3关闭
fclose(fp);
}
fgetc 的使用 :
#include<stdio.h>
void main()
{
//1、打开
FILE* fp=fopen("./msg.data","r");//以只读打开
//判断文件是否能打开成功
if(NULL==fp)
{
printf("失败\n");
return;
}
//2、操作
/*
char value=0;2
//while(EOF!=value)
while(0==feof(fp))//feof()没有到末尾返回0 到了末尾返回1
{
value=fgetc(fp);
printf("%d %c\n",value,value);
}
*/
char buf[100]="";
fgets(buf,3,fp);//读取100个字符
printf("%s",buf);
//3、关闭
fclose(fp);
}
fscanf fgets 的使用 :
#include<stdio.h>
struct msg
{
char name[20];
char sex;
int id;
float score;
};
void main()
{
//1打开
FILE* fp=fopen("./test.txt","r");
if(NULL==fp)
{
printf("打开失败\n");
return;
}
//2操作
struct msg m;
fscanf(fp,"name:%s sex:%c ID:%d score:%f",m.name,&m.sex,&m.id,&m.score);//从文件中获取(读取)信息
printf("%s %c %d %f\n",m.name,m.sex,m.id,m.score);
/*
char buf[100]="";
while(0==feof(fp))
{
fgets(buf,100,fp);//读取一行
//获取一行,并打印屏幕上
printf("%s",buf);
}
*/
//3关闭
fclose(fp);
}
将信息写入到文件(二进制) fwrite 的使用 :
#include<stdio.h>
struct msg
{
int id;
char name[10];
};
void main()
{
//1文件操作步骤: 只写打开:
FILE*fp =fopen("./data","wb");
if(NULL==fp)
{
printf("打开失败\n");
return ;
}
//2操作
//将信息写入到文件:二进制
/*
int a[10]={100,200,300,400,500,600,700,800,900,1000};
int ilen=fwrite(&a,4,10,fp);//写的长度:每次写入的长度*次数
printf("%d\n",ilen);
*/
/*
char buf[100]="helloworld";//[105][101][101]
fwrite(buf,1,10,fp); //1Byte*10次=10Byte
*/
struct msg m={1001,"lifei"};
fwrite(&m,1,sizeof(struct msg),fp);
//3关闭
fclose(fp);
}
二进制的读取文件 : fread 的使用 :
#include<stdio.h>
struct msg
{
int id;
char name[10];
};
void main()
{
//1打开
FILE* fp=fopen("data","rb");
if(NULL==fp)
{
printf("文件打开失败\n");
return;
}
//2操作
/*
int id;
while(fread(&id,1,4,fp)>0)
printf("%d\n",id);
*/
struct msg m;
fread(&m,1,sizeof(struct msg),fp);
printf("%d %s\n",m.id,m.name);
//3关闭
fclose(fp);
}
习题 : 文本:
int a=11的二进制存放到文件中
显示:1011 (区分:字符与数字) ‘1’ 1
#include<stdio.h>
int er(FILE* fp,int a)
{
if(a == 0)
return 0;
else
{
er(fp,a/2); //使用递归来实现
fputc(a%2+48,fp);
}
}
void main()
{
FILE* fp=fopen("./test.txt","wb+");
if(NULL==fp)
{
printf("文件打开失败\n");
return ;
}
int a=11;
er(fp,a);
fclose(fp);
}
习题 : 文本:
读取test.txt中的内容并存放到数组中
#include<stdio.h>
void main()
{
FILE* fp=fopen("./test.txt","rb+");
if(NULL==fp)
{
printf("失败\n");
return ;
}
char buf[5]="";
fgets(buf,5,fp);
printf("%s",buf);
fclose(fp);
}
习题 : 二进制:
定义一个学生信息,将班级的学生信息写入到文件中(>5个学生)
struct student
{
int id;
char name[10];
float score;
};
#include<stdio.h>
struct student
{
int id;
char name[10];
float score;
};
void main()
{
FILE* fp=fopen("./test.txt","rb+");
if(NULL==fp)
{
printf("文件打开失败\n");
return ;
}
struct student s[8]={{110,"chh",88},
{111,"dls",99},
{112,"ydd",84},
{113,"dwm",89},
{114,"cxh",76},
{115,"eee",67},
{116,"yyy",50},
{117,"hui",68}};
fwrite(&s,20,8,fp);
fclose(fp);
}
习题 :
读取上题的文件,判断文件中有多少个人.
#include<stdio.h>
struct student
{
int id;
char name[10];
int score;
};
void main()
{
FILE* fp=fopen("./test.txt","rb+");
struct student s;
int i=0;
while(0<fread(&s,1,sizeof(struct student),fp))
{
printf("%d\n",s.id);
i++;
}
printf("文件中有%d个人\n",i);
fclose(fp);
}
习题 :
读取上上题的文件,输出>60的人,且个数多少。且最高分是谁?
#include<stdio.h>
struct student
{
int id;
char name;
int score;
};
void main()
{
FILE* fp=fopen("./test.txt","rb+");
struct student s;
int j=0;
while(0<fread(&s,1,sizeof(struct student),fp))
{
if(s.score>60)
{
j++;
}
}
printf("一共有:%d大于60分",j);
fclose(fp);
}