C++构造函数打开文件问题
/**
* DictParser is used to parse a file
* it parse a line every time
*/
class DictParser {
public:
DictParser(std::string path) : _fs(path) {};
~DictParser() {
_fs.close();
}
void add_column(ParserBase* p) {
_lp.add_parser(p);
}
int parse_next_line() {
std::string line;
std::getline(_fs, line);
return _lp.parse(line);
}
bool is_file_end() {
if (!_fs.good()) {
return true;
} else {
return false;
}
}
void reset_file(std::string path) {
_fs.close();
_fs.open(path);
}
private:
std::fstream _fs;
LineParser _lp;
DISALLOW_COPY_AND_ASSIGN(DictParser);
};
下面用这个类创建对象,并且打开文件;
DictParser dp("data/data.txt"); //DictParser is used to parse a file
有啥问题
【以下回答由 GPT 生成】
问题的关键在于如何在C++的构造函数中打开文件,并在析构函数中关闭文件。下面是一个具体的解决方案:
#include <iostream>
#include <fstream>
#include <string>
class DictParser {
public:
DictParser(std::string path) : _fs(path) {
if (!_fs.is_open()) {
// 如果文件打开失败,可以在这里抛出异常或者终止程序
std::cerr << "Failed to open file: " << path << std::endl;
}
};
~DictParser() {
if (_fs.is_open()) {
_fs.close();
}
}
void add_column(ParserBase* p) {
_lp.add_parser(p);
}
int parse_next_line() {
std::string line;
std::getline(_fs, line);
return _lp.parse(line);
}
bool is_file_end() {
return _fs.eof();
}
void reset_file(std::string path) {
if (_fs.is_open()) {
_fs.close();
}
_fs.open(path);
if (!_fs.is_open()) {
std::cerr << "Failed to open file: " << path << std::endl;
}
}
private:
std::fstream _fs;
LineParser _lp;
DISALLOW_COPY_AND_ASSIGN(DictParser);
};
int main() {
DictParser dp("data/data.txt"); // 使用DictParser对象dp来解析文件
while (!dp.is_file_end()) {
dp.parse_next_line();
}
dp.reset_file("new_data/new_data.txt");
while (!dp.is_file_end()) {
dp.parse_next_line();
}
return 0;
}
上面的代码中,首先在DictParser的构造函数中打开文件,如果打开失败会输出错误信息,并可以根据具体需求抛出异常或终止程序。
在析构函数中,如果文件已经打开,则关闭文件。
在reset_file函数中,先关闭之前打开的文件,然后打开新的文件。如果打开新文件失败,同样输出错误信息。
在主函数中,首先使用已经打开的文件进行解析,然后通过reset_file函数打开新的文件,再次进行解析。
【相关推荐】