文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,(如文件的名字、文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中,由系统声明,取名为FILE。
FILE* pf;
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
文件的打开和关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开文件
pFile = fopen ("myfile.txt","w");
//文件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭文件
fclose (pFile);
pFile = NULL;
}
return 0;
}
文件的顺序读写
顺序读写函数介绍
文件的随机读写
fseek函数介绍
根据文件指针的位置和偏移量来定位文件指针。
offset:偏移量
origin:
1. SEEK_SET:指针从起始位置开始偏移;
2. SEEK_CUR:指针从当前位置开始偏移;
3. SEEK_END:指针从结尾位置开始偏移。
fseek函数的使用
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ("example.txt", "wb");
fputs ("This is an apple.", pFile);
fseek (pFile , 3, SEEK_SET);
fseek (pFile , 3, SEEK_CUR);
fseek (pFile , -3, SEEK_END);
fputs ("sam", pFile);
fclose (pFile );
return 0;
}
ftell函数介绍
返回文件指针相对于起始位置的偏移量。
ftell函数的使用
int main()
{
FILE* pf = fopen("data.txt", "r");//abcdef
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
//定位文件指针到f
int ch = fgetc(pf);
printf("%c\n", ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
ch = fgetc(pf);
printf("%c\n", ch);//c
int pos = ftell(pf);
printf("%d\n", pos);
fclose(pf);
pf = NULL;
return 0;
}
rewind函数介绍
让文件指针的位置回到文件的起始位置。
也可以用fseek( pf, 0, SEEK_SET );让文件指针的位置回到文件的起始位置。
rewind函数的使用
int main()
{
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
//定位文件指针到f
int ch = fgetc(pf);
printf("%c\n", ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
rewind(pf);
ch = fgetc(pf);
printf("%c\n", ch);//a
int pos = ftell(pf);
printf("%d\n", pos);
fclose(pf);
pf = NULL;
return 0;
}
文本文件和二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。
文件读取结束的判定
在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
fgetc 判断是否为 EOF 。
fgets 判断返回值是否为 NULL 。
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
fread判断返回值是否小于实际要读的个数。
int main()
{
FILE* pfRead = fopen("data1.txt", "r");
if (pfRead == NULL)
{
perror("open file for read");
return 1;
}
FILE* pfWrite = fopen("data2.txt", "w");
if (pfWrite == NULL)
{
perror("open file for write");
fclose(pfRead);
pfRead = NULL;
return 1;
}
//读写文件
int ch = 0;
while ((ch = fgetc(pfRead)) != EOF)//判断返回值是否是EOF,如果不是则继续读取
{
fputc(ch, pfWrite);
}
//关闭文件
fclose(pfRead);
pfRead = NULL;
fclose(pfWrite);
pfWrite = NULL;
return 0;
}