系列文章目录
📜前言
在读写文件时,如果需要清空配置文件怎么办?不知道大家能想到几种方法,自己尝试了几种方法可以清空文件,在此分享给大家。
一、使用fopen函数
声明:FILE *fopen(const char *filename, const char *mode)
参数:
- filename – 字符串,表示要打开的文件名称。
- mode – 字符串,表示文件的访问模式,可以是以下表格中的值:
模式 | 描述 |
---|---|
“r” | 打开一个用于读取的文件。该文件必须存在。 |
“w” | 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 |
“a” | 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 |
“r+” | 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 |
“w+” | 创建一个用于读写的空文件。 |
“a+” | 打开一个用于读取和追加的文件。 |
👉从表格的描述中可以看到,当模式选择“w”时,会删除已存在文件的内容,利用这一点可以实现清空文件内容的功能。
#include <stdio.h>
#define CFG_FILE "./config"
/**
* @brief 清空文件内容
*/
int main(int argc, char *argv[])
{
FILE *pfd = NULL;
pfd = fopen(CFG_FILE, "w+");
if(pfd)
{
printf("clear file context!\n");
fclose(pfd);
}
return 0;
}
二、使用ftruncate函数
/***************************************************************************
*名称:ftruncate
*
*说明:
*函数的作用是:将文件大小截断为字节长度。
*如果文件先前大于此大小,则会丢失额外的数据。
*如果以前的文件较短,则会对其进行扩展,扩展部分将读取为磁盘数据。
*指向打开文件对象的fp指针。
*返回值:
*成功时,0。
*出现错误时,返回-1,并适当设置errno:
*
****************************************************************************/
int ftruncate(int fd, off_t length); //声明
👉从声明中可以看出,当形参length变量为0时,会将文件截断为0个字节,清空文件内容。扒拉源码看了一下,发现底层调用的是驱动,让驱动程序执行截断动作,具体驱动的实现没有去追踪,希望大佬给分享一下。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define CFG_FILE "./config"
/**
* @brief 清空文件内容
*/
int main(int argc, char *argv[])
{
int fdSrc;
fdSrc = open(CFG_FILE,O_RDWR);
//清空文件
ftruncate(fdSrc, 0);
//从新跳转位置到开头--重要
lseek(fdSrc,0,SEEK_SET);
//然后再执行写入操作
//TODO
...
return 0;
}
⏰注意事项,使用ftruncate函数之后,记得使用lseek将位置跳转到文件开头再进行写入!
三、使用fstream函数
再fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:
/****************************************************************
* @brief Opens an external file.
* @param __s The name of the file.
* @param __mode The open mode flags.
*
* Calls @c std::basic_filebuf::open(__s,__mode). If that
* function fails, @c failbit is set in the stream's error state.
****************************************************************/
void open(const char* filename, int mode, int access);
模式 | 描述 |
---|---|
ios::app | 以追加的方式打开文件 |
ios::ate | 文件打开后定位到文件尾,ios::app就包含有此属性 |
ios::binary | 以二进制方式打开文件,缺省的方式是文本方式 |
ios::in | 文件以输入方式打开 |
ios::out | 文件以输出方式打开 |
ios::nocreate | 不建立文件,所以文件不存在时打开失败 |
ios::noreplace | 不覆盖文件,所以打开文件时如果文件存在则失败 |
ios::trunc | 如果文件存在,把文件长度设置为0 |
👉 从表格中可以看出,模式选择ios::trunc时,如果文件存在,会把文件的长度设置为0。利用这一点就可以实现将文件清空的功能。
#include <stdio.h>
#include <fstream>
#define CFG_FILE "./config"
/**
* @brief 清空文件内容
*/
int main(int argc, char *argv[])
{
/*第一种形式*/
std::fstream fs(CFG_FILE, std::fstream::out | std::ios_base::trunc);
/*第二种形式*/
std::fstream fsm;
fsm.open(CFG_FILE, std::fstream::out | std::ios_base::trunc);
//TODO
...
return 0;
}
总结
整理的全是干货,目前想到了这三种方式来实现清空文件内容,其他方式想到了再补充。