2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

C/C++ 清空文件内容

时间:03-14来源:作者:点击数:55

📜前言

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


一、使用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;
  • }

总结

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门