前面三部分已经给大家介绍过了,网址发给大家方便大家复习
打开方式如下:
文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 建立一个新的文件
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件
实例代码:
/* fopen fclose example */
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开文件
pFile = fopen ("myfile.txt","w");
//文件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭文件
fclose (pFile);
}
return 0;
}
4. 文件的顺序读写
4.1 顺序读写函数介绍
功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("test.txt", "w");//定义一个变量pf,pf指向这个文件信息区,文件信息区和文件本身相关联,这时候我们就可以读或者写或者对文件做一些其他的事情等等
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//写文件
//......
//关闭文件
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
这里有同学可能会问,为什么要关闭pf所指向的这个文件呢?
这是因为文件也是资源,最后你把文件关闭掉也就是将资源释放掉了,一个程序能打开的文件个数是有数的,并不是说可以无限打开,我打开之后关闭了以便我后期打开更多的文件,而且如果你不关闭这个文件可能会造成数据的丢失等等,所以一定要关闭文件并且置为NULL
fputc函数
大家来看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
char i = 0;
for (i = 'a'; i <= 'z'; i++)
{
fputc(i, pf);
}
//写文件
//......
//关闭文件
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
大家可以将代码拷贝一份去自己测试一下
这个时候我们再打开test.txt文件来看一看我们刚才的26个字母是否都已经写到文件里面了
大家看,结果属实
现在我们要以字符的形式将我的我的文件里的字符都拿出来,这个时候就要用到fgetc函数
fgetc函数
简言之,如果读到一个错的字符就返回EOF
现在我们来看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
//char i = 0;
//for (i = 'a'; i <= 'z'; i++)
//{
// fputc(i, pf);
//}
//写文件
//......
//关闭文件
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
大家看fgetc就把文件里面的所有字符都读取出来了
现在呢我们写一行数据,这个时候就要用到fputs函数
fputs函数
const char * str, FILE * stream
Write string to stream这里的意思是将字符串写到流(也就是文件)里面去
大家看,大家可能就有疑问了,我们刚才不是写了26个英文字母吗,为什么这里的26个字母不见了呢?这是因为你再次向文件里面写数据的时候,会自动将你原来文件里面写的东西全部清空然后重新写,希望大家能够理解
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("test.txt", "w");//"w"改成"a"的时候是追加的意思。我们来看下面的图片
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
fputs("hello bit", pf);
//int ch = 0;
//while ((ch = fgetc(pf)) != EOF)
//{
// printf("%c ", ch);
//}
//char i = 0;
//for (i = 'a'; i <= 'z'; i++)
//{
// fputc(i, pf);
//}
//写文件
//......
//关闭文件
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
FILE pf = fopen(“test.txt”, “w”);//"w"改成"a"的时候是追加的意思。我们来看下面的图片*
现在我们要随机读一行数据应该怎么办呢,所以我们引入fgets函数
fgets函数
读到的字符串将会拷贝到str指向的空间的位置
最多的字符的个数将会被拷贝到str里面
大家可以尝试着自己理解一下
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
char arr[20];
fgets(arr, 5, pf);
printf("%s\n", arr);//放5的时候最多能够读到4个
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
这里给大家介绍一下perror这个函数,用起来更方便一些
perror函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* pf = fopen("test", "r");
if (pf == NULL)
{
//printf("%s\n", strerror(errno));
perror("fopen");
return 1;
}
char arr[20];
fgets(arr, 5, pf);
printf("%s\n", arr);//放5的时候最多能够读到4个
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
/这里给大家介绍一下fprintf函数
fprintf函数
将代码给大家
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
char arr[20];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan",25,50.5f };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
//printf("%s\n", strerror(errno));
perror("fopen");
return 1;
}
fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//fprintf将数据写到文件里面去
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
如果想要把数据从文件中读出来,这里就必须引入fscanf函数
fscanf函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
char arr[20];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan",25,50.5f };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
//printf("%s\n", strerror(errno));
perror("fopen");
return 1;
}
fscanf(pf, "%s %d %f", s.arr, (&s.age), &(s.score));//fscanf从文件里面去读,将信息从pf指向的文件读出来放到s里面去,再将其打印出来
printf("%s %d %f", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
fwrite函数的介绍
fwrite函数
这个时候你发现你有一些东西是看不懂的,这是因为这是以二进制的形式写进去的
我们以二进制的形式写进去那么就可以以二进制的形式读出来,这时候就要引入fread函数
fread函数
我们以二进制的形式写进去,我们就可以已二进制的形式读出来
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
char arr[20];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan",25,50.5f };
FILE* pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//fwrite(&s, sizeof(struct S), 1, pf);
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d %f\n", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;//设置成空指针使其再也找不到这块空间
return 0;
}
本章终!