C/C++ 清空文件内容

系列文章目录

文章目录

  • 系列文章目录
  • :scroll:前言
  • 一、使用fopen函数
  • 二、使用ftruncate函数
  • 三、使用fstream函数
  • 总结


前言

在读写文件时,如果需要清空配置文件怎么办?不知道大家能想到几种方法,自己尝试了几种方法可以清空文件,在此分享给大家。


一、使用fopen函数

声明:FILE *fopen(const char *filename, const char *mode)

参数:

  • filename – 字符串,表示要打开的文件名称。
  • mode – 字符串,表示文件的访问模式,可以是以下表格中的值:
模式 描述
“r” 打开一个用于读取的文件。该文件必须存在。
“w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+” 创建一个用于读写的空文件。
“a+” 打开一个用于读取和追加的文件。

从表格的描述中可以看到,当模式选择“w”时,会删除已存在文件的内容,利用这一点可以实现清空文件内容的功能。

#include 
#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 
#include 
#include 
#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 
#include 
#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;
}

总结

整理的全是干货,目前想到了这三种方式来实现清空文件内容,其他方式想到了再补充。

你可能感兴趣的:(C/C++,c++,c语言,算法)