//:很多注意点写在了代码的注释中
一.文件的基本操作
这一小节包括不同类型的数据存入文件
int main()//写入数字 和字符串 和 结构体
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");//如果想追加写入 可以用'ab', 'wb'会覆盖
//也可以写成 D:\\DeV项目\\平时学习\\文件操作.txt
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
//方法一
int buf[4]={1,2,3,4} ;
fwrite(buf,1,sizeof(buf),fp);
//方法二:格式化为字符串进行写入
for (int i=0;i<4;i++)
{
char text[16];
sprintf(text,"%d,",buf[i]);
fwrite(text,1,strlen(text),fp);
}
//字符串
char buf1[16]="hello";
fwrite(buf1,1,sizeof(buf1),fp);
//结构体
struct Student
{
int id;
char gender;
char name[16];
} ;
Student stu = {17090417,'M',"howuei"};
//fwrite(&stu,1,sizeof(Student),fp);
fwrite(&stu.id,1,4,fp);
fwrite(&stu.gender,1,1,fp);
fwrite(&stu.name,1,16,fp);
fclose(fp);
return 0;
}
二.文件的存储格式
原则是:能存能取
这就需要我们在存储时加上一定的分隔符
#include<stdio.h>
#include<stdlib.h>
//文件存储的原则:能存能取————这就要求我们在文件存储的时候需要哟一定的分隔符。
int save()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
// int a = 12345;
// int b = 6789;
// fwrite(&a,1,4,fp);
// fwrite(&b,1,4,fp);//class a
//数组的存储
int arr[4] = {1,23,3,4};
fwrite(arr,1,16,fp);
fclose(fp);
}
int load()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
// int buf[2];
// int i=0;
// while(!feof(fp))
// {
// fread(buf+i,1,4,fp);
// i++;
// }
// printf("%d,%d",buf[0],buf[1]);//class a
while(!feof(fp))
{
int a;
if(fread(&a,1,4,fp) <= 0)
{
break;
}
printf("%d\n",a);
}
fclose(fp);
}
int main()
{
//save();
load();
return 0;
}
**//尤其要注意的是save 和 load 函数要注释一个才能调用另一个。**
三.文件的数据读取
当文件较大时,可以采用每次读取一定长度的字节来解决。
#include<stdio.h>
#include<stdlib.h>
int save()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
//存入一段较长的字符串
char buf1[130]="hello,world!good,morning,everyone";
fwrite(buf1,1,sizeof(buf1),fp);
}
int load()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
//当文件很大时,不能一次性读完,可以每次读一定的长度
char buf[4];
while(!feof(fp))
{
int n = fread(buf,1,4,fp);//buf要存储到的目标地址
if(n > 0)
{
printf("read %d bytes\n",n);
}
}
}
int main()
{
//save();
load();
return 0;
}
四.文件的随机访问
这里调用的是fseek函数
int fseek(FILE *stream,int offset,int mode)
stream:文件指针
offset:整数表示偏移值
mode:相对位置
返回值 : 0 成功 -1 失败
跳到第100个字节的位置
fseek(fp,100,SEEK_SET)
跳到倒数第100个字节的位置
fseek(fp,100,SEEK_END)
跳到当前位置往前第100个字节的位置
fseek(fp,100,SEEK_CUR)
跳到当前位置往后第100个字节的位置
fseek(fp,100,SEEK_CUR)
#include<stdio.h>
#include<stdlib.h>
int load()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
unsigned char buf[4];
if(fseek(fp,4,SEEK_SET)==0)
{
fread(buf,1,4,fp);
}
fclose(fp);
}
int main()
{
load();
return 0;
}
**//切记不要频繁 调用 fseek ,否则伤害硬盘。最好一次性读大量数据**
五.文件的按行存储
即每次存储加一个 \n 换行符
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int save()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","wb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
char ip[] = "192.108.1.10";
int port = 8080;
char line[256];
// sprintf(line,"ip = %s \n ",ip);
// fwrite(line,1,strlen(line),fp);
//
// sprintf(line,"port = %d \n",port);
// fwrite(line,1,strlen(line),fp);
//可简化为
fprintf(fp,"ip = %s\n ",ip);
fprintf(fp,"port = %d\n",port);
fclose(fp);
}
int load()
{
FILE *fp = fopen("D:/DeV项目/平时学习/文件操作.txt","rb");
if(fp==NULL)
{
printf("Fail to open!\n");
return -1;
}
char buf[512];
while(!feof(fp))
{
char* line = fgets(buf,512,fp);
if(line)
{
printf("got : %s \n",line);
}
}
fclose(fp);
}
int main()
{
//save();
load();
return 0;
}