c ++:ifstream删除文件的内容?

时间:2016-03-22 11:03:35

标签: c++ ifstream

我正在使用以下功能:

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();
    }
}

上述功能的内容是测试文件中的第一行是否包含&#39; // new&#39;如果为true,则返回2。如果为false,则返回1。到目前为止,此工作正常。

我感到困惑的是,运行后文件scripts.txt为空。怎么可能是因为

1。)&#39; //新&#39;线路被正确识别,因为我得到了&#39; 2&#39;返回(在空文件上运行,按预期返回1)。因此,在打开文件scripts.txt期间,它会被空文件覆盖

2.。)ifstream被设计为只读

我缺少的是什么?

编辑:

c的定义是

static const boost::regex
    c("^(\\/)(\\/)(new|New| new| New)");  // Regexp for line count  

2 个答案:

答案 0 :(得分:2)

ifstream永远不应该操纵您的文件。您需要在其他地方查找您的问题,它不在此代码中。您最好的选择是提供一个展示您问题的Minimal, Complete, and Verifiable example

但是,您应该检查您的编码,您缺少错误处理和处理编译器警告等基本要素。最有可能的是,如果您的其他代码看起来相同,那就是问题的根源。

就个人而言,我会写这样的函数:

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);
}

答案 1 :(得分:1)

此功能不会清除文件内容。因此,如果文件已清除,则会在getline_count外部清除。

为了证明这一点,我们可以检查ifstream相对于文件的每次调用的功能:

  

在内部,该函数首先构造一个岗哨对象(noskipws设置为true)来访问输入序列。然后(如果good),它从其关联的流缓冲区对象中提取字符,就好像调用其成员函数sbumpcsgetc一样,最后在返回之前销毁该岗位对象。

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

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

  1. 确保您正在查看正确的文件,并且在代码外部没有正在清除文件的进程
  2. 在代码中搜索&#34; scripts.txt&#34;其他东西必须通过名称访问该文件并进行调试
  3. 禁止写入&#34; scripts.txt&#34;并查看是否可以找到无法写入文件的代码