C++:IF流删除文件的内容

c++: ifstream delete contents of a file?

本文关键字:文件 删除 IF C++      更新时间:2023-10-16

我正在使用以下函数:

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),它从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpcsgetc一样,最后在返回之前销毁哨兵对象。

  • ifstream::~ifstream 这是隐式声明的,所以它只是销毁对象,关闭文件;如果这个删除的文件内容,没有人能够使用ifstream

查找文件清除罪魁祸首的建议步骤是:

  1. 确保您查看的是正确的文件,并且代码外部没有一些清除文件的进程
  2. 在代码中搜索"脚本.txt",其他内容必须按名称访问文件并进行调试
  3. 禁用写入"脚本.txt",看看是否可以找到无法写入文件的代码