学习C++的小伙伴,应该会经常遇见对文件进行操作的需求,例如读写文件,作为一个使用频率较高的操作,我们每次重复地编写代码,就是浪费劳动力了,所以作者将自己常用的文件操作封装成了一个类,需要的小伙伴自取哦,喜欢的小伙伴刻个给博主一个关注嗷!
文末附源码,可直接使用。
使用的文件操作函数为C标准库<stdio.h>的函数。主要实现打开、关闭、刷新、读写文件;获得文件名、路径、大小;寻找文件起始和结束等操作。
功能实现详解
打开文件
对文件进行读写操作的第一步就是打开文件。
该函数使用说明
参数1:文件名
参数2:打开模式
返回值:BOOL类型,是否打开成功。
bool MyFile::Open(const char* szFilename, const char* mode)
{
Close();//关闭文件,这里如果有上次打开的文件,先进行关闭
pString = new char[LINE_LEN + 1];
mFilename = new char[strlen(szFilename) + 1]; // char* mFilename;
strcpy(mFilename, szFilename);
pFile = fopen(mFilename, mode);//按照指定的模式打开指定文件
return pFile == NULL ? 0 : 1;
}
我们这里使用fopen()函数打开文件。其功能是使用给定的模式 mode 打开 filename 所指向的文件。文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在 error 中。该函数位于C 标准库<stdio.h>中。
FILE *fopen(const char *filename, const char *mode);
参数
filename-- 这是 C 字符串,包含了要打开的文件名称。
mode-- 这是 C 字符串,包含了文件访问模式。
功能
使用给定的模式mode打开filename所指向的文件。
fopen参数说明
参数mode字符串包含了文件访问模式,欲打开的文件路径及文件名,参数 mode 字符串则代表着流形态。
关闭文件
该函数使用说明
无参数
无返回值
关闭文件很简单,如果文件名存在,因为我们之前new动态申请,所以需要先delete释放内存,并赋值为空。
文件指针FILE* pFile存在的话,就使用函数fclose()直接关闭,并赋值空。
void MyFile::Close()
{
if(mFilename)
{
delete mFilename;
mFilename = NULL;
}
if(pFile)
{
fclose(pFile);
pFile = NULL;
}
if(pString)
{
delete pString;
pString = NULL;
}
}
刷新文件
该函数使用说明
无参数
无返回值
使用库函数fflush()。
fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。
void MyFile::Flush()
{
if(pFile == NULL)
return;
fflush(pFile);
}
读文件
该函数使用说明
参数1:读取文件到缓存区pBuffer,需要提前申请
参数2:需要读取的长度
返回值:读取文件长度
ULONG MyFile::Read(void* pBuffer, int size)
{
if(pBuffer == NULL || size == 0)
return 0;
if(pFile == NULL)
return 0;
return fread(pBuffer, 1, size, pFile);
}
主要函数fread( void * buffer , size_t size , size_t count , FILE * stream );
fread是一个函数,是计算机程序中从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0。
参数即返回值说明:
参 数
buffer
用于接收数据的内存地址,大小至少是 size* count字节.
size
单个元素的大小,单位是字节
count
元素的个数,每个元素是size字节.
stream
输入流
返回值
实际读取的元素个数.如果返回值与 count不相同,则可能文件结尾或发生错误.
从ferror和feof获取错误信息或检测是否到达文件结尾.
读文件字符串
首先确认文件是否为空,然后判断参数长度是否大于行长;然后使用fgets()读取字符串。
fgets,是C语言中从文件中获取字符串函数。从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋’\0’),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
bool MyFile::ReadString(char* szBuffer