一.什么是文件
日常生活中我们常说的文件通常指的是磁盘中文件。从程序设计的角度来看,我们可将程序分为两类,一是程序文件,二是数据文件
程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为exe)等文件
数据文件
所有与程序进行数据交互的文件都可以被称为数据文件,那我D盘下的一个ppt是不死数据文件呢?如果你要从它里面读取数据到内存中,或者将内存中的数据写入它里面,那么这个ppt就可以称为数据文件。本文讲述的文件操作值得就是数据文件
二.使用文件的三个步骤
使用一个可以分为三步:
1.打开文件
2.读(输入)或写(输出)数据
3. 关闭文件
关于第二步的输入和输出怎么理解。可以给出这样的一张图来解释
所谓的输入和输出都是针对程序或者内存而言的
三.文件的打开和关闭
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream )
这里的mode是文件的打开方式,包含以下几种
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
下文会用到"r",“w”,"r’b,"wb"四种打开方式
四.文件的读和写
读写文件是通过函数来实现的,下面介绍几个常用的函数
1.fputc
他是字符输出函数,返回值是输出的字符对应的ASCII码,如果输出失败,就会返回EOF
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "W");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
//把26个字母写到文件中
for (int i = 'a'; i <= 'z'; i++)
{
fputc(i, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
2.fgetc
他是字符输入函数。返回文件指针指向的那个字符,也就是读取到的字符,并且会让指向文件内容的指针向下一个字符偏移。当读取失败时,会返回EOF。
int main()
{
//打开文件
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = 0;
for (int i = 0; i < 26; i++)
{
ch = fgetc(pf);
printf("%c ", ch);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.fgets
他是文本行输入函数,可以一次读取多个字符
str是你想要把读取到的数据放到的内存空间,通常是一个字符数组,num是你想要读取的字符个数,这里面’\0‘会占一个位置,所以实际读取的字符个数要为num-1。Stream就是你要读取的那个文件的指针。
int main()
{
//打开文件
FILE* pf = fopen("text.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//读一行数据
char arr[20] = { 0 };
fgets(arr, 5, pf);
printf(arr);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
4.fputs
他是文本行输出函数,使用示例如下
int main()
{
//打开文件
FILE* pf = fopen("text.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写一行数据
fputs("hello world\n", pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
5.fread
他是二进制输入函数,把文件中的数据以二进制的形式读进内存。ptr是一个内存块的指针,读到的数据将会放在这块空间,size是读取的每个元素的大小,count是想要读取的元素个数,stream是要操作的文件的指针。
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "rb");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//读文件
char a;
fread(&a, sizeof(char), 1, pf);
printf("%c", a);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
6.fwrite
他是二进制输出函数。使用示例如下
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "wb");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//写文件
char a = 'c';
fwrite(&a, sizeof(char), 1, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
return 0;
}