本科期间C语言的课本无论哪个版本都会有【文件】这一章节,不过好多学校基本上不讲或者就出一道选择题,讲得很浅,今天这篇详细总结一下这部分的知识~
一.原理解析
文件是指存在在外部介质(如磁盘、磁带)上的数据集合。操作系统是以文件为单位对数据进行管理的~(这是408的常识。)
程序执行时就称为进程,进程运行中的数据均存在内存中。需要存储运算后的数据时,就需要使用文件。这样程序下次启动后,就可以直接从文件中读取数据~
C语言对文件的处理方式如下:
- 缓冲文件系统:系统自动在内存区为每一个正在使用的文件开辟一个缓冲区,用缓冲文件系统进行的输入、输出称为高级磁盘输入、输出。
- 非缓冲文件系统:系统不自动开辟确定大学的缓冲区,而由程序为每个文件设定缓冲区,对应低级输入、输出。
缓冲区的原理:本质即为一段内存空间
- 全缓冲:磁盘文件的读写操作
- 行缓冲:遇到换行符才执行IO操作
- 不带缓冲
(意义在于提高对文件的读写效率)
flie类型,看一下成员变量即可~
(不同系统和编译器的成员变量可能会有差异)
我们通过文件指针来访问文件类型的变量~
二.文件打开及关闭
有关【流】的说法,指的就是指向文件的指针~
文件打开失败的情形:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r");if(fp==NULL){perror("fopen"); return -1; } return 0;
}
文件必须和可执行成程序在同一目录下:这样再执行上述代码就不会报错~
在文件中键入任意字符:
通过fgetc可以获取第一个字符并输出:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r");char c;c=fgetc(fp);printf("%c",c); return 0;
}
用循环将文件中的字符全部输出:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r");char c;while((c=fgetc(fp))!=EOF)printf("%c",c); return 0;
}
修改代码,再向目标文件中写入“ABCDEFG”:(注意,权限要修改为“r+”,即允许写入)
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE* fp;//file类型的指针fp=fopen("file.txt","r+");char c;while((c=fgetc(fp))!=EOF)printf("%c",c); char i;for(i='A';i<='G';i++)c=fputc(i,fp);return 0;
}
博主已经执行了两次代码,如下图: (顺便提一句,r+是以文本的方式打开文件的~)
由于文件指针是自移的,所以再执行一遍,上述字符会全部输出:
并且再度多一倍:
(用Visual的话要分开读写操作!)
三.文件读写
上述两个只能操作一个字符,下面介绍批量操作的。
把之前file.txt里面的字符全部清空,然后执行下面的代码:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {char buf[32]="Jsl and Hyh~";FILE* fp;//file类型的指针int ret;//函数返回值 fp=fopen("file.txt","r+");ret=fwrite(buf,sizeof(char),12,fp);fclose(fp); }
字符写入文件:
需要注意一个细节,由于windows的设计,各位在以文本方式写入后,必须以文本方式读出,不然可能会有字节上的些许差异:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {// char buf[32]="Jsl and Hyh~";FILE* fp;//file类型的指针int ret;//函数返回值 fp=fopen("file.txt","r+");
//
// ret=fwrite(buf,sizeof(char),12,fp);char buf1[32]={0};ret=fread(buf1,sizeof(char),32,fp);printf("%s",buf1); fclose(fp); }
fgets和fputs同理,不过只能用于文本文件~
四.位置指针偏移
人工控制位置指针的方式:
代码如下:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {char buf[32]="Jsl and Hyh~";FILE* fp;//file类型的指针int ret;//函数返回值 int pos;fp=fopen("file.txt","r+");fwrite(buf,sizeof(char),12,fp);//写完以后无法直接读取字符串ret=fseek(fp,-5,SEEK_CUR); pos=ftell(fp);char buf1[32]={0};fread(buf1,sizeof(char),32,fp);printf("%s",buf1);fclose(fp); }
非常完美!