关于文件缓冲区 :所谓缓冲文件系统是指系统自动地在内存为程序中每一个正在使用的文件开辟一个文件缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向计算机读人数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后从缓冲区逐个地将数据送到程序数据区。
什么是文件指针?
文件类型指针,简称“文件指针”。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字,文件状态及文件的当前位置),这些信息保存在一个结构体变量中。该结构体类型是由系统声明的,取名 FILE,在头文件stdio.h中。不需要用户定义,可以直接使用。
FILE f1;
以上定义了一个结构体变量f1,用它可以存放一个文件的有关信息。这些信息是在打开一个文件时由系统根据文件的情况自动存放的,在读写文件时需要用到这些信息,也会修改某些信息。例如在读一个字符后,文件信息区的位置标记的指向就要改变。
FILE *p; //定义文件结构体指针
通常这样定义,将指针p指向某一个文件信息区,通过该文件信息区就可以访问该文件,通过文件指针变量能够找到与它关联的文件。
fopen函数用法
fopen(文件名,使用文件方式);
例如:fopen(“a1”,“r”);
表示打开a1的文件,打开方式为“读入”(r代表read)。fopen函数的返回值是指向a1文件的指针(即a1文件信息区的起始地址),通常将fopen的返回值复制给一个文件的指针变量,例如:
FILE *p; //定义指向文件的指针变量
p=fopen("a1","r"); //将fopen的返回值赋给p
这样p就指向的a1文件
文件的打开方式:
"r"(只读) | 为输入打开一个文本文件 |
"w"(只写) | 为输出打开一个文本文件 |
"a"(追加) | 向文件文件尾添加数据 |
"rb"(只读) | 为输入打开一个二进制文件 |
"wb"(只写) | 为输出打开一个二进制文件 |
"r+"(读写) | 为读写打开一个文本文件 |
"w+"(读写) | 为读写建立一个新的文本文件 |
"a+"(读写) | 为读写打开一个文本文件 |
"rb+"(读写) | 为读写打开一个二进制文件 |
"wb+"(读写) | 为读写建立一个新的二进制文件 |
"ab+"(读写) | 为读写打开一个二进制文件 |
当我们打开一个文件时候还要判断是否打开正确,所以要加入以下代码
if ((fp = fopen(filename, "a")) == NULL)
{
printf("打开错误\n");
exit (0);
}
其中exit(0)的作用是关闭所有文件,终止正在执行的程序,等待用户检查,exit 在头文件stdlib.h中。
文件的关闭
在使用完一个文件之后应该关闭它。关闭就是撤销文件信息区和文件缓冲区,在文件指针变量不再指向该文件,也就是文件指针变量与文件“脱钩”,以后不能再通过该指针对原来与其相关联的文件进行读写操作。
关闭文件使用fclose函数。fclose函数调用的一般形式:
fclose(文件指针);
例如:fclose(p);
怎样向文件读写字符
这里用到两个函数:fgetc(),fputs()。
fgetc(p);//从p指向的文件读入一个字符
fputs(ch,p); //把字符ch写到文件指针变量p所指向的文件中
下面举一个例子来说明问题:
从键盘上输入一些字符,并逐个把它们送到磁盘上去,知道用户输入一个“#”为止
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp; //定义指针变量fp
char ch, filename[10];
printf("请输入所用文件的名字:");
scanf("%s", filename); //输入文件名及其后缀格式
getchar(); //用来消化最后输入的回车符
if ((fp = fopen(filename, "w")) == NULL) //打开文件并使fp指向此文件
{
printf("错误\n");
exit (0);
}
printf("请输入一个准备存储到磁盘的字符串以#结束:");
ch = getchar(); //接收从键盘输入的第一个字符
while (ch != '#') //当输入#时结束循环
{
fputc(ch, fp); //将接收的字符写到fp所指向的文件中
putchar(ch); //在屏幕上输出
ch = getchar(); //继续接收下一个字符
}
fclose(fp); //关闭文件
putchar(10); //输出换行符
return 0;
}