关于#c++#的问题:C++构造函数打开文件问题

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函数打开新的文件,再次进行解析。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^