为什么使用文件?
使用文件可以将数据直接存放在电脑的硬盘上,做到数据的持久化。
一般来说,做到数据持久化的方法有把数据放在磁盘文件、存放到数据库等方式。
什么是文件?
文件的分类
磁盘上显示的文件就是文件。一般有数据文件和程序文件。
![](https://img-blog.csdnimg.cn/img_convert/84d8ab190bcd5bd02229d2ba97ea567f.png)
文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。
3.文件的打开与关闭
文件的指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称**“文件指针”**。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE。
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
FILE* pf;//文件指针变量
不同的C编译器的FILE类型包含的内容不完全相同,但是原理基本上是一致的。
FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
文件的打开和关闭
ANSIC 规定使用:
fopen函数来打开文件
fclose来关闭文件。
要记住的是当打开文件后对数据进行处理完一定要关闭文件,否则可能会造成数据的丢失。
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
![](https://img-blog.csdnimg.cn/img_convert/2b4a7c69d3b70b395a958acefe39b706.png)
/* 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;
}
文件的读写顺序
![](https://img-blog.csdnimg.cn/img_convert/c0cd275e2f2cff577c0f7ec3478d0ab3.png)
四、fseek函数
根据文件指针的位置和偏移量来定位文件指针。文件指针顾名思义也是一个指针,它能指向一个字符串中的某个位置。它要接收的参数有:
可以在下面代码中查询到相关的函数的使用和参数 https://legacy.cplusplus.com/reference/cstdio/fseek/?kw=fseek
![](https://img-blog.csdnimg.cn/img_convert/0474ea0d6964eb691607d597d13b971e.png)
第一项是SEEK_CUR,即当前文件指针的偏移处开始向后偏移。
第二项是SEEK_END,即从文件的最末尾处开始向前偏移,当然在偏移数一定要为负数才能读取文件中的内容。
第三项是SEEK_SET,即从文件的最前端处开始向后偏移。
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ( "example.txt" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0; }
结果是This is a sample.
原因是在第一次fputs中是把This is an apple.先放入记事本当中,当调用fseek函数时,从当前的文件指针处向后偏移9个字节,文件指针一开始默认指向的是文件的首地址处。因此向后偏移9个字节后(偏移一个字节包括空格)指向的是最后一个空格的地址处。而第二次fputs函数是将“ sam”这个内容在上次文件指针指向的地址处开始写入。
五、ftell函数
函数比较简单,输入的参数为文件指针流,而返回值的类型为int,即返回的是文件指针所指向的偏移量处。
#include <stdio.h>
int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}
六、rewind函数
rewind函数的返回值类型为void型,它所需要的参数是文件指针流。
#include <stdio.h>
int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile = fopen ("myfile.txt","w+");
for ( n='A' ; n<='Z' ; n++)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]='\0';
puts (buffer);
return 0; }