事先声明:代码编辑时使用的是CLion,Visual Stdio存在部分差异,此处不予讨论
目录
一、读写文件原理
从磁盘中读取内容,为了提高效率,创建缓冲区,实质为在内存中开辟的一部分空间
二、文件打开关闭
1.fopen()
需要提前创建一个file.txt文件(在如下层级创建)
FILE *fp;//文件指针
//打开文件
fp = fopen("file.txt", "r+");
//判断是否正确打开
if (NULL == fp) {
perror("fopen");//定位失败原因
return -1;
}
r:只读 w:只写
r+:可读可写 w+:可读可写
rb+二进制 wb+二进制
区别:1.r+以文本进行时,\n写入磁盘时是\r\n;rb+二进制不会
2.w+没有文件会创建文件,但if文件中有内容会刷掉
2.fclose()
fclose(fp);
三、文件读写
1.fwrite() 、fread()
读写字符串
//已经打开文件
char buf[20]="hello\nworld";
fp.fwrite(buf,sizeof(char),strlen(buf),fp);
//读取buf中的ele,每个ele大小为sizeof(char),总共长度为strlen(buf),从fp开始写入
//新建一个char[]存储读取的内容
char buf1[20]={0};
fread(buf1,sizeof(char),sizeof(buf1),fp);
//存储到buf1中,每个ele大小为sizeof(char),最多能读取sizeof(buf1)个ele,从fp开始读取
(2)fputc()、fgetc()
读写单个字符
char c;
//写单个字符
fputc('H',fp);
//把字符H写在最后
//读
c = fgetc(fp);
//fgetc()返回单个字符,结尾返回EOF
//读所有字符
while((c=fgetc(fp))!=EOF){
printf("%c",c);
}
(3)fgets()
读整行字符
char buf[20]={0};
//1.读取一行ele
fp.fgets(buf,sizeof(buf),fp);
//读取到buf中,一次最多读取sizeof(buf)的字符串,从fp开始
//2.读从键盘中输入的ele
fp.fgets(buf,sizeof(buf),stdio);
//3.读取全文
while(fp.fgets(buf,sizeof(buf),fp) != NULL){
printf("%s",buf);
}
attn:fgets()在读取时会读取\n
四、文件位置指针偏移
1.应用场景
在写入ele之后,指针指向结尾,我想读取写入的内容,让指针前移即可
2.fseek()、ftell()
(1)fseek()介绍
fseek(fp,offset,origin)
offset是移动多少,往前移是负数
origin设置从哪移动,0开头,1当前位置,2结尾
(2)实现
FILE *fp;
fp = fopen("file.txt","r+");
char str[] = "hello\nworld";
//写入内容
fwrite(str,sizeof(char),strlen(str),fp);
//此时指针在最后
int i;
//if移动成功返回0,else返回非0
i = fseek(fp,-5,0);
if(0 != i){
perror("fseek");
}
long pos;
pos = ftell(fp);
//指针距离开头的距离
printf("pos = %ld",pos); //7
//reason:按照文件读取,len=12,前移5,key=7
//把str清空
memset(str,0,sizeof(str));//置为0
//读
fread(str,sizeof(char),sizeof(str),fp);
printf("str=%s",str);//world