我正在使用以下功能:
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
答案 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
相对于文件的每次调用的功能:
ifstream::open
如果模式设置为ios_base::trunk
ifstream::operator bool
这是一种const
方法,因此ifstream
无法修改ifstream::getline
TLDR:这只能提取,而不是写入文件:在内部,该函数首先构造一个岗哨对象(
noskipws
设置为true
)来访问输入序列。然后(如果good
),它从其关联的流缓冲区对象中提取字符,就好像调用其成员函数sbumpc
或sgetc
一样,最后在返回之前销毁该岗位对象。
ifstream::~ifstream
这是隐式声明的,所以它只是破坏对象,关闭文件;如果这个删除的文件内容没有人能够使用ifstream
找到文件清除罪魁祸首的建议步骤是: