所有文件都采用二进制方式记录数字 如果文件里的所有二进制内容都对应字符则这种文件叫文本文件
除了文本文件以外的所有文件叫做二进制文件
文本文件可以当作二进制文件使用
文件操作的基本步骤
1.打开文件(fopen)
2.操作文件(fread/fwrite)
3.关闭文件(fclose)
fopen函数需要两个参数
1.代表要打开的文件路径
2.代表打开文件的方式(决定程序中可以对文件做什么操作)
打开方式有如下选择
"r" 只能察看文件内容
只能从文件头开始察看 如果文件不存在打开会失败
"r+" 比"r"多了修改功能
"w" 只能修改文件内容不能察看 只能从文件头开始修改
如果文件不存在就创建文件 如果文件已经存在就删除文件内容
"w+" 比"w"多了察看功能
"a" 只能修改文件内容不能察看 在文件原有内容后面追加新内容
如果文件不存在就创建文件 如果文件存在不会修改文件原有内容
"a+" 比"a"多了察看功能
"b"也是一种打开方式 它可以和上面任何一种打开方式混用 这个打开方式表示程序中只能采用二进制方式操作文件
fopen函数的返回值是一个地址,这个地址应该记录在文件指针里 程序中只能使用文件指针代表打开的文件
fopen函数如果打开文件失败则返回值是NULL 一旦完成对文件的操作之后必须使用fclose函数关闭文件
fclose函数需要文件指针作为参数 关闭文件后文件指针成为野指针,必须恢复成空指针
文件操作分为两种
1.把内存中一组连续存储区的内容拷贝到文件里(写文件)
2.把文件中一组连续字节的内容拷贝到内存里(读文件)
fread函数采用二进制方式读文件内容
fwrite函数采用二进制方式写文件内容
这两个函数都需要四个参数
1.内存中第一个存储区的地址
2.内存中单个存储区的大小
3.希望操作的存储区个数
4.文件指针
它们的返回值表示实际操作的存储区个数
fprintf函数可以把数据按照格式记录到文本文件里 这个函数的参数就是在printf函数参数的前面增加一个文件指针
fscanf函数可以按照格式从文本文件里获得数字并记录到存储区里 它的参数就是在scanf函数参数的前面增加一个文件指针
计算机里为每个打开的文件保留一个整数,这个整数表示下一次读写操作的开始位置 这个位置一定在两个相邻的字节之间
这个整数表示文件头开始到这个位置之间包含的字节个数 这个整数叫做文件的位置指针
每当从文件中获得n个字节或向文件里写入n个字节后位置指针向后移动n个位置
ftell函数可以得到位置指针的数值
rewind函数可以把位置指针设置成文件开头
fseek函数可以把位置指针设置到文件里的任何位置
fseek函数里需要设置一个基准位置以及目标位置到基准位置的距离
SEEK_SET 0 把文件头作为基准位置
SEEK_CUR 1 把当前位置作为基准位置
SEEK_END 2 把文件尾作为基准位置
如果目标位置在基准位置后则距离用非负数表示
如果目标位置在基准位置前则距离用负数表示
距离的绝对值就是两个位置之间的字节个数
===========示例代码=====================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void write(){
FILE *file = fopen("a.txt","a");
char *p = "大熊工作室\n";
fprintf(file,"%s",p);
fclose(file);
file = NULL;
}
void read(){
FILE *file = fopen("a.txt","r");
if(!file){
perror("fopen");exit(-1);
}
fseek(file,0,2);
printf("file byte:%ld\n",ftell(file));
fseek(file,0,0);
int size = 0;
char arr[5]={0};
while(1){
size = fread(arr,5,1,file);
if(!size){
break;
}
printf("%s",arr);
}
printf("\n");
}
int main(){
// 文本文件的读写
write();
read();
return 0;
}
*****************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int Id;
float salary;
char *name;
}student;
void writeab(){
FILE *file = fopen("b.bin","ab");
if(!file){
perror("fopen");exit(-1);
}
student st;
st.Id = 100;
st.salary = 1000.01;
st.name = "北极熊";
fwrite(&st,sizeof(student),1,file);
fclose(file);
file = NULL;
}
void readab(){
FILE *file = fopen("b.bin","rb");
if(!file){
perror("fopen");exit(-1);
}
int size = 0;
while(1){
student st;
size = fread(&st,sizeof(student),1,file);
if(!size){
break;
}
printf("ID :%d\n",st.Id);
printf("salary :%g\n",st.salary);
printf("name :%s\n",st.name);
}
}
int main(){
// 二进制文件的读写
writeab();
readab();
return 0;
}