1. 文件的打开关闭、打开方式
文件的打开
int main(int argc,char * argv[])
{
FILE *fp = fopen("out.dat","w+"); //打开的文件为 out.dat 打开方式为 w+
if(fp==NULL) //如果fp为null则说明 打开失败
{
printf("OPEN FILE FAILE \n");
}
fprintf(fp,"OPEN FILE SUCCEED \n");
}
打开方式
模式 | 描述 | 目标文件存在 | 目标文件不存在 |
---|---|---|---|
r | (只读) 打开一个文本文件 | 正常只读 | 返回NULL |
w | (只写) 打开一个文本文件 | 清空、正常只写 | 创建文件 |
a | (追加) 向文件文件尾添加数据 | 正常追加 | 创建文件 |
r+ | (读写) 打开一个文本文件 | 正常读写 | 返回NULL |
w+ | (读写) 建立一个新的文本文件 | 清空、正常读写 | 创建文件 |
a+ | (读写) 打开一个文本文件 | 正常追加 | 创建文件 |
如果在以上任意打开方式后加入'b',如rb rb+。则是对一个二进制文件进行只读或读写。
文件的关闭
int fclose(FILE * p);
//关闭文件指针
内存单元以页为单位 一页代表4KB 一次至少申领33页 只要申请了就算全部释放也会留下33页
文件内容的读取
1.字符IO
fgetc
读取单个字符 读取后fp指针后移
#include<stdio.h>
#include<string.h>
int main(int argc,char * argv[])
{
FILE *fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("FILE:%s faile",argv[1]); argv[0]存储运行指令(a.out) argv[1]存储目标文件名
}
char s[40]="";
int i=0;
while(1)
{
int ch=fgetc(fp);
if(feof(fp)) //到达文件末尾
break;
s[i++]=ch;
}
printf("%s",s);
return 0;
}
fpuc
将单个字符写入文件,位子自动往后移动
#include<stdio.h>
#include<string.h>
int main(int argc,char * argv[])
{
FILE *fp=fopen(argv[1],"w");
if(fp==NULL)
{
printf("FILE:%s faile",argv[1]);
}
char s[40]="Write here";
int i=0;
char c;
while(1)
{
c=fgetc(fp);
if(feof(fp))
break;
s[i++]=c;
}
return 0;
}
2.字符串IO
fgets
读取一个字符串中特定长度的字符
#include<stdio.h>
int main(int agrc,char * agrv[])
{
if(agrc<2)
{
printf("use:%s FILEname",agrv[0]);
return -1;
}
FILE * fp = fopen(agrv[1],"r+");
char buf[10]="";
fgets(buf,5,fp); //从fp中读取5个字符给buf 如果fp中第五个字符不是空白 则会抛弃并且自动补\0
printf("%s",buf);
return 0;
}
fputs
字符串buf写入fp所指的文件之中
#include<stdio.h>
int main(int agrc,char * agrv[])
{
if(agrc<2)
{
printf("use:%s FILEname",agrv[0]);
return -1;
}
FILE * fp = fopen(agrv[1],"r+");
char buf[10]="HELLO";
fputs(buf,fp);
return 0;
}
二进制IO
fread
#include<stdio.h>
struct bok
{
int no;
char name[40];
int price;
};
int main(int argc,char * argv[])
{
struct bok ba[4]={};
FILE * fp = fopen(argv[1],"r");
if(fp==NULL)
{
printf("打开文件失败\n");
}
int i=0;
struct bok temp={};
while(1)
{
if(fread(&temp,sizeof(struct bok),1,fp)>0)
{
ba[i]=temp;
i++;
}else{
break;
}
}
int j;
for(j=0;j<i;j++)
{
printf("%d %s %d\n",ba[j].no,ba[j].name,ba[j].price);
}
return 0;
}
fwrite
#include<stdio.h>
struct bok
{
int no;
char name[40];
int price;
};
int main(int argc,char * argv[])
{
struct bok ba[4]={{1,"山海经",10},
{2,"水浒传",20},
{3,"西游记",30},
{4,"从百草园走到三味书屋",50}};
FILE * fp = fopen(argv[1],"w");
if(fp==NULL)
{
printf("打开文件失败\n");
}
int i=0;
for(i=0;i<4;i++)
{
fwrite(ba+i,sizeof(struct bok),1,fp);
}
return 0;
}
格式化IO
fprintf
#include<stdio.h>
int main()
{
FILE *fp = fopen("abc.dat","w+");
int i=0;
if(fp==NULL)
{
printf("OPEN FILE FAILE \n");
return 0;
}
fprintf(fp,"case:%d OPEN FILE SUCCEED",i);
return 0;
}
fscanf
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[10], str2[10], str3[10];
int year;
FILE * fp;
fp = fopen ("out.dat", "w+");
fputs("We are in 2021", fp);
rewind(fp);
fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
printf("Read String1 |%s|\n", str1 );
printf("Read String2 |%s|\n", str2 );
printf("Read String3 |%s|\n", str3 );
printf("Read Integer |%d|\n", year );
fclose(fp);
return(0);
}
随机IO
void fseek(FILE *fp ,long offset,int orgin);
offset 偏移量 正向后 负向前 正左负右
origin 参考位置 SEEK_SET开头 SEEK_CUR当前位置 SEEK_END 末尾
void rewind(FILE * fp); //将指针位置指向开头 fseek(fp,0,SEEK_SET);
获取文件位置
long int fteil(FILE * fp);