C语言中的文件操作
1、文件的打开
创建文件指针变量
File* pf;
定义一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区,通过文件指针变量就能够找到与它关联的文件
(1)文件的打开
使用fopen函数打开文件,使用fclose函数关闭文件
打开函数的使用形式:
FILE* fopen(const char* filename,const char* mode);//第一个参数是文件名,第二个参数是打开的方式
打开的方式有:
完整的文件打开操作:
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {FILE* pf = fopen("text.txt", "r");//这个文件就和代码在一个路劲下,使用的是相对路径if (pf == NULL) {printf("%s\n", strerror(errno));}//读文件//文件的关闭fclose(pf); pf = NULL;return 0;
}
如果想打开其他位置上的文件就需要加上绝对路径:
比如这里我们想打开桌面上的文件:
FILE* pf = fopen("C:\\Users\\邓欣洋\\Desktop\\text.txt", "r");//但是需要使用转义字符,原本使用一个‘\’,这里就需要两个‘\’
(2)文件的读写
- 关于一个字符的读,使用的函数为fputc()函数,
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {FILE* pf = fopen("text.txt", "w");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//写文件fputc('g', pf);//写一个字符到文件里面//文件的关闭fclose(pf); pf = NULL;return 0;
}
-
关于文件的读:
-
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <errno.h>int main() {FILE* pf = fopen("text.txt", "r");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//读文件char c = fgetc(pf);printf("%c\n", c);//读一个字符到文件里面//文件的关闭fclose(pf); pf = NULL;return 0;}
-
写一行数据到文件里面
-
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <errno.h>int main() {FILE* pf = fopen("text.txt", "w");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//写文件fputs("hello world!!!", pf);//这是写一行数据到文件里面,原来有的内容就会被现在的数据覆盖//如果在这里不想销毁之前的内容可以将方式改成a,即//FILE* pf = fopen("text.txt", "a");//文件的关闭fclose(pf); pf = NULL;return 0;}
-
读一行数据,并打印出来读的是什么
-
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <errno.h>int main() {FILE* pf = fopen("text.txt", "r");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//读文件char arr[10];fgets(arr,5,pf);//第一个参数是将文件中的数据读到那个地方里面,第二个参数是读多少个字符,第三个数据是从哪个文件里面读//文件的关闭fclose(pf); pf = NULL;return 0;}
-
格式化写数据到文件里面
-
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <errno.h>struct S {char arr[10];int age;float grade;};int main() {struct S s = { "zhangsan",18,98.5 };FILE* pf = fopen("text.txt", "w");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//写数据fprintf(pf, "%s %d %f", s.arr, s.age, s.grade);//文件的关闭fclose(pf); pf = NULL;return 0;}
-
格式化读数据
-
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <errno.h>struct S {char arr[10];int age;float grade;};int main() {struct S s = { 0 };FILE* pf = fopen("text.txt", "r");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//读数据fscanf(pf, "%s %d %f", &(s.arr), &(s.age), &(s.grade));printf("%s %d %f\n", s.arr, s.age, s.grade);//文件的关闭fclose(pf); pf = NULL;return 0;}
以上的函数是针对所有的输入和输出流
接下来的函数只针对文件流,只能写到文件里面,或者从文件里面读数据
(3)fwrite函数
以二进制的形式写进文件中
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>struct S {char arr[10];int age;float grade;
};
int main() {struct S s = {"zhangsan",20,85};//以二进制的形式写入文件FILE* pf = fopen("text.txt", "wb");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//以二进制的方式写fwrite(&s, sizeof(struct S), 1, pf);//文件的关闭fclose(pf); pf = NULL;return 0;
}
(4)fread函数
以二进制的形式读数据
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>struct S {char arr[10];int age;float grade;
};
int main() {struct S s = {0};//以二进制的形式读入文件FILE* pf = fopen("text.txt", "rb");if (pf == NULL) {printf("%s\n", strerror(errno));return 1;}//以二进制的方式读fread(&s, sizeof(struct S), 1, pf);//第一个参数是读到哪里去,第二个参数是所读数据的大小,第三个参数是要读多少个这样的数据,第四个参数是从哪里读printf("%s %d %f\n", s.arr, s.age, s.grade);//文件的关闭fclose(pf); pf = NULL;return 0;
}
(5)sprintf和sscanf函数
sscanf是从一个字符串中转化成一个格式化的数据,sprintf是把一个格式化的数据转化成字符串
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>struct S {char arr[10];int age;float grade;
};
int main() {struct S s = {"zhangsan",20,97};struct S tmp = { 0 };char buf[100] = { 0 };//把s中的格式化的数据转化成字符串bufsprintf(buf, "%s %d %f", s.arr, s.age, s.grade);//这个buf里面就是"zhangsan 20 97.00000"是一个字符串//从字符串buf中获取一个格式化的数据到tmp中;sscanf(buf, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.grade));return 0;
}