C++:IF流删除文件的内容
c++: ifstream delete contents of a file?
我正在使用以下函数:
int getline_count()
{
boost::smatch resultc;
string sLine;
int line_add_tmp;
ifstream infile;
infile.open("scripts.txt", ios_base::in);
if (!infile){
cerr << "scripts.txt could not be opened!" << endl;
}
else {
getline(infile, sLine);
if (boost::regex_match(sLine, c)) {
line_add = 2;
}
else {
line_add = 1;
}
return line_add;
infile.close();
}
}
上述函数的意图是测试文件中的第一行是否包含 '//new' 如果为 true,则返回 2。如果为 false,则返回 1。到目前为止,这工作正常。
我感到困惑的是,运行文件脚本后.txt为空。这怎么可能,因为
1.) 正确识别了"//new"行,因为我返回了"2"(在空文件上运行按预期返回 1)。所以不可能是在打开文件脚本期间.txt它被空文件覆盖
2.) ifstream被设计为只读
我错过的是什么?
编辑:
c 的定义是
static const boost::regex
c("^(\/)(\/)(new|New| new| New)"); // Regexp for line count
ifstream
永远不应该操作你的文件。您需要在其他地方查找您的问题,它不在此代码中。最好的办法是提供一个最小、完整和可验证的示例来演示您的问题。
但是,您应该检查编码,缺少错误处理和处理编译器警告等基本要素。最有可能的是,如果你的其他代码看起来相同,那就是你问题的根源。
就个人而言,我会像这样编写您的函数:
bool first_line_in_file_matches(const std::string& filename, const boost::regex& c)
{
std::string line;
std::ifstream infile(filename.c_str());
if (!infile)
{
cerr << filename << " could not be opened!" << endl;
// TODO: THROW AN EXCEPTION MAYBE? OR RETURN FALSE? EXIT HERE
}
return getline(infile, line) && boost::regex_match(line, c);
}
此函数不会清除文件的内容。因此,如果实际上文件被清除,则会在外部清除以getline_count
。
为了证明这一点,让我们检查每个调用相对于文件的功能ifstream
:
-
ifstream::open
仅当模式设置为ios_base::trunk
时,这才会清除文件 -
ifstream::operator bool
这是一种const
方法,因此无法修改ifstream
-
ifstream::getline
TLDR:这只能提取,不能写入文件:
在内部,该函数通过首先构造一个哨兵对象(
noskipws
设置为true
)来访问输入序列。然后(如果good
),它从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpc
或sgetc
一样,最后在返回之前销毁哨兵对象。
-
ifstream::~ifstream
这是隐式声明的,所以它只是销毁对象,关闭文件;如果这个删除的文件内容,没有人能够使用ifstream
查找文件清除罪魁祸首的建议步骤是:
- 确保您查看的是正确的文件,并且代码外部没有一些清除文件的进程
- 在代码中搜索"脚本.txt",其他内容必须按名称访问文件并进行调试
- 禁用写入"脚本.txt",看看是否可以找到无法写入文件的代码
相关文章:
- 如何在我从C++文件中读取后立即删除行
- 删除 XML 文件中的子节点C++
- 如何在输入新内容 c++ 之前删除文件中的所有内容
- 如何更新和删除文本文件中的特定逗号分隔值?C++
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 将内容从第一个文件("constituencies")移动到第二个文件("temp")并在之后重命名时,我的文件被删除
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 如何自动获取我的项目的路径并删除一些文件
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- 在 c++ 中打开文件、删除标点符号并追加到另一个文件中
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 重命名批处理文件(删除名称中的一些符号)(python/matlab/shell)
- 如何找到字符串并使用C 文件中的文件删除它
- 使用 DEF 文件删除 dll 导出的名称
- 关闭后等待文件删除
- c++中的文件删除
- 如何共享文件删除权限时,我打开一个文件ifstream
- 典型的Win32文件删除(IDropTarget::drop)实现
- 生成文件模式规则:循环生成文件.o < - 删除生成文件依赖项