对文件的理解
什么是文件
文件就是电脑C盘里存放东西就叫文件,从功能上我们会把文件分为二种:
- 程序文件
程序文件分为三种:源程序文件(后缀为.c)
目标文件(windows环境后缀为.obj)
可执行程序(windows环境 后缀为.exe) - 数据文件
数据文件就是我们在运行程序所产生的内容或者是读写的数据
而文件的组成又分为三部分:
- 文件路径
文件路径是用来表示文件所在的位置
例如:C:\ Windows \ addins
上面表示的是:addins
文件在的位置在C盘
里Windows
文件中 - 文件名
文件名就是字面上的意思,文件的名字,用来分别文件里存放的是什么文件或软件
文件里还可以存放很多的子文件 - 文件的后缀
文件的后缀代表的是文件的功能
文件的类型指针
如果想打开一个文件,就会用到文件的类型指针,又叫文件指针(FILE*
)
- 文件指针(
FILE*
)
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息
(如文件的名字,文件状态及文件当前的位置等)
这些信息是保存在一个结构体变量中,该结构体类型是有系统声明的 - 文件指针(
FILE*
)的类型申明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
- 这是系统里(
FILE*
)的类型申明,不同的编译器的FILE类型包含的内容不完全相同,但是大同小异
正常都是通过一个FILE
的指针来维护这个FILE结构的变量,这样使用起来更加方便。
文件指针(FILE*
)的使用
正常是 FILE* + 变量名
,这样就叫文件指针变量
FILE* pd;
流
任何一个C程序,运行起来就会默认打开3个流
1、FILE* stdin
(标准输入流) ,从键盘上输入数据对应的是 printf
2、FILE* stdout
(标准输出流),打印数据到屏幕上对应的是 scanf
3、FILE* stderr
(标准错误流)打引错误信息到显示器
流可以理解为输入/输出缓冲区
文件的使用函数
文件的打开(fopen)和关闭(fclose)
文件打开(fopen)函数参数
FILE * fopen ( const char * filename, const char * mode );
- 第一个参数
filename
:是要打开文件的文件名 - 第二个参数
mode
:是文件要用什么方式进行打开
文件的打开方式:
文件的打开方式 | 描述 | 如果文件不存在 |
---|---|---|
“r” (只读) | 打开一个已经存在的文本文件,读取数据 | 出错 |
“w” (只写) | 打开一个文本文件,输出数据 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(读取) | 输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,新建一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
文件关闭(fclose)函数的参数
int fclose ( FILE * stream );
- 参数
stream
:是文件指针,文件使用完后一定要fclose关闭,并把文件指针置空。(和 free 使用方法一样)
如果不关闭文件会导致数据的丢失
文件的打开(fopen)和关闭(fclose)的使用
int main()
{
FILE* pd = fopen("maun.txt", "r");//打开文件
if (pd == NULL)
{
perror("fopen");
return 1;
}
//写文件
........
//关闭文件
fclose(pd);
pd = NULL;
return 0;
}
文件的顺序读写
文件的顺序读写就是按照一定的顺序进行输入或者输出
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输入流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输入流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输入流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
使用fgetc输入
fputc功能:只写一个字符
fputc 输出函数的参数
int fputs ( const char * character, FILE * stream );
- 第一个参数:character:要写入的字符
第二个参数:stream:指向输出流 FILE 对象的指针
fputc 输出函数的使用:
int main()
{
FILE* pd = fopen("moun.txt", "w");// w 是只写
if (pd == NULL)
{
perror("fopen");
return 1;
}
//写文件
//循环的方式进行写
for (char i = 'a'; i <= 'z'; i++)
{
fputc(i , pd);
}
//关闭文件
fclose(pd);
pd = NULL;
return 0;
}
结果:
使用fputc输出
fgetc 输出函数的参数
int fgetc ( FILE * stream );
fgetc 输入函数的使用:
fgetc功能:只读一个字符
int main()
{
FILE* pd = fopen("moun.txt", "r");// r 是只读一个字符
if (pd == NULL)
{
perror("fopen");
return 1;
}
//读文件
char i = fgetc(pd);
printf("%c\n", i);
//读第二次
i = fgetc(pd);
printf(