主要介绍一下C语言文件操作的api。
文件指针与文件开关
FILE * p;文件指针,可以直接操作文件中的内容。
fopen(dir,type);打开一个文件,返回文件指针,指向文件中的第一个位置。
fclose(p);关闭文件
p = NULL;使用完,注意将文件指针赋值为NULL,不让其成为野指针。
int main(){
FILE * p;
p = fopen("d://a.txt","r");
if(p == NULL){
printf("文件打开失败\n");
exit(-1);
}
fclose(p);
p = NULL;
return 0;
}
文件打开类型
文件打开类型有多种,最常用的几种有
r,只读的方式打开一个文本文件,不存在则打开失败
w,只写的方式打开一个文件,不存在则创建
a,追加的方式打开一个文件,不存在则创建
r+,读写的方式,不存在则打开失败
w+,读写方式打开或者新建一个文件,允许读写。
a+,读写方式打开文本文件,在文本末尾追加数据,不存在则创建一个。
ab,追加的方式打开一个二进制文件,不存在则打开失败。
rb,读的方式打开一个二进制文件,不存在则打开失败。
wb,写的方式打开一个二进制文件,不存在则创建。
上面有的多,但是事实上,却很好记忆,你只要认识3个单词,read,write,append即可
常用操作文件的函数
fgetc(p) != EOF;读取一个字符,这里的EOF事实上就是常量-1
int main(){
FILE * p;
if((p = fopen("d://a.txt","r")) == NULL){
printf("文件打开失败\n");
};
char c[100];
int i = 0;
while((c[i] = fgetc(p)) != EOF){
i++;
}
c[i] = '\0';
printf("%s",c);
fclose(p);
p = NULL;
return 0;
}
fputc(c,p);写出一个字符,c为字符,p为文件指针。
char s[] = "qwe";
int length = strlen(s);
int index = 0;
while(index < length){
fputc(s[index ++],p);//p为文件指针
}
ftell(p);获取当前文件的指针的位置
fseek(p,0L,SEEK_END);设置当前文件指针的位置,这里有三个参数,第一个参数是文件指针,第二个参数是便宜量,第三个参数是,设置的位置
通常的,我们通过文件指针来获取到文件的体积
int curIndex = ftell(p);
fseek(p,0L,SEEK_END);
int lastIndex = ftell(p);
int length = lastIndex - curIndex;
feek(p,curIndex,SEET_SET); //将文件指针设置回原位置
fwrite(&node,sizeof(Node),1,p);
这里4个参数,第一个参数,将存放哪个结构体,第二个参数是结构体的大小,第三个参数是准备存放几个结构体,p是文件指针。写入成功返回1。
fread(&node,sizeof(Node),1,p);第一个参数是准备存放到哪个结构体,其他参数跟fwrite的意义是一样的。这个函数读取成功返回1。
typedef struct Student {
int age;
char * name;
int c;
int d;
}Student;
void writeTest() {
Student s;
s.age = 1;
s.c = 1;
s.d = 1;
s.name = (char *)malloc(10);
strcpy(s.name, "abcde");
FILE * f;
if ((f = fopen("D://a.dat", "wb")) == NULL) {
printf("程序打开失败\n");
exit(-1);
}
fwrite(&s, sizeof(s), 1, f);
fwrite(s.name, 10, 1, f);
fclose(f);
f = NULL;
free(s.name);
}
void readTest() {
Student s;
FILE * p;
if ((p = fopen("D://a.dat", "rb")) == NULL) {
printf("程序打开失败\n");
exit(-1);
}
fread(&s, sizeof(s), 1, p);
s.name = (char *)malloc(10);
fread(s.name, 10, 1, p);
printf("%s", s.name);
free(s.name);
fclose(p);
p = NULL;
}
fputs(str,f);//两个参数,第一个参数是将要存的字符串的指针,第二个参数是文件指针,直接输出str中的所有字符串,输出完成之后不会输出换行符。注意这里与puts的区别。
void fputsTest() {
FILE * f;
if ((f = fopen("d://a.txt", "w")) == NULL) {
printf("文件打开失败\n");
exit(1);
}
const char * str = "hello word";
const char * str2 = "abc";
fputs(str, f);
fputs(str2, f);
fclose(f);
f =`
NULL;
}
fgets(str,length + 1,f);这里三个参数,第一个参数是存放到哪个字符串,第二个参数是读取几个字节,注意这里要写成读取的字节数+1,原因是最后加一个’\0’,第三个参数是文件指针。同时应该注意到的一点是,汉子是占2个字节占2个字节。
void fgetsTest() {
FILE * f;
if ((f = fopen("d://a.txt","r")) == NULL) {
puts("文件打开失败");
exit(1);
}
char s[200];
fgets(s, 5,f);
puts(s);
fclose(f);
f = NULL;
}
重点掌握,fgetc,fputc,fread,fwrite;4个函数