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中的格式化的数据转化成字符串buf
sprintf(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;
}