本科期间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);
}
非常完美!