1、文件基本操作
1.1、文件操作的步骤
- 引入头文件(stdio.h)
- 打开文件
- 使用文件指针
- 关闭文件
1.2、文件相关的概念
- 按文件的逻辑结构:记录文件、流式文件
- 按存储介质:普通文件、设备文件
- 按数据的组织形式:文本文件、二进制文件
1.3、文件缓冲区
- 在程序的数据区和磁盘之间进行数据交换的时候,要经过缓冲区的传递
- 不同平台的缓冲区大小不同
- 刷新缓冲区:fflush(fp)
- 在文件指针关闭、程序结束、文件缓冲区满的三种情况下,缓冲区的内容都会写入文件,否则不会
- 对于 ACSI C 标准采用文件缓冲区,系统调用不会使用文件缓冲区
1.4、输入输出流
- 流表示了信息从源到目的端的流动
- 输入操作时:数据从文件流向计算机内存(文件读取)
- 输出操作时:数据从计算机六流向文件(文件的写入)
- 文件句柄:实际是一个结构体,标志着文件的各种状态
1.5、文件操作 API
- fgets、fputc:按照字符读写文件
- fputs、fgets:按照行读写文件(读写配置文件)
- fread、fwrite:按照块读写文件(大数据块迁移)
- fprintf、fscanf:按照格式化进行读写文件
2、标准的文件读写
2.1、文件的顺序读写
typedef struct Stu
{
char name{50};
int id;
}Stu;
int main()
{
fputc('c',stdio);
char ch=fgetc(stdin);
fputc(stderr,"%c",ch);
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","w+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
char buf="cnsakcsccmdmaasx";
int i=0;
int n=strlen(buf);
for(i=0;i<n;i++)
{
int res=fputc(buf[i],fp);
}
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
FILE *fp=NULL;
fp=fopen("./test.txt","r+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
char ch;
while(ch=fgetc(fp)!=EOF)
{
printf("%c",ch);
}
printf("\n");
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","w+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
char *buf[]={"aaaaaaaaaa\n","ssssssssss\n","dddddddddd\n","ffffffffff\n"};
for(int i=0;i<4;i++)
{
int res=fputs(buff[i],fp);
}
char rbuf[30]={0};
while(!feof(fp))
{
char *p=fgets(rbuf,sizeof(buf),fp);
printf("%s\n",rbuf);
}
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","w+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
Stu s[3];
char buf[50];
for(int i=0;i<3;i++)
{
sprintf(buf,"stu%d%d%d",i,i,i);
strcpy(s[i].name,buf);
s[i].id=i+1;
}
int res=fwrite(s,sizeof(Stu),3,fp);
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","r+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
Stu s[3];
char buf[50];
int ret=fread(s,sizeof(Stu),3,fp);
for(int i=0;i<3;i++)
{
printf("%s %d\n",s[i].name,s[i].age);
}
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","w+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
printf("hello\n");
fprintf(fp,"hello, I am pig,mike=%d\n",250);
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","w+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
int a=0;
fscanf(fp,"hello,I am pig,mike=%d\n",&a);
printf("%d\n",a);
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
return 0;
}
2.2、文件的随机读写
#include
int fseek(FILE *stream,long offset,int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int main()
{
FILE *fp=NULL;
fp=fopen("文件路径/test.txt","r+");
if(fp==NULL)
{
perror("fopen");
return -1;
}
Stu s[3];
Stu tmp;
fseek(fp,sizeof(Stu)*2,SEEK_SET);
int ret=fread(&tmp,sizeof(Stu),1,fp);
if(ret==1)
{
printf("%s %d\n",tmp.name,tmp.id);
}
fseek(fp,0,SEEK_SET);
ret=fread(s,sizeof(Stu),2,fp);
for(int i=0;i<2;i++)
{
printf("%s %d\n",s[i].name,s[i].id);
}
if(fp!=NULL)
{
fclose(fp);
fp=NULL;
}
return 0;
}