如何在多个函数中操作一个 ifstream 对象

How to manipulate a ifstream object in multiple functions

我正在处理一个涉及解析 XML 文档的项目,我需要创建一个对文件起作用的打开和关闭函数。我有一个 class,它有一个 ifstream 对象和两个使用相同对象的函数关闭和打开。 问题是在打开函数中,对象默认关闭,直到程序到达关闭函数,它总是 returns 即使打开了一个文件,你也没有打开文件。 有没有办法使对象成为全局对象以便创建它以便它可以在两个函数中工作? 任何建议表示赞赏

 class CommandParser
   {
     private:
      std::ifstream inFile; 
      std::string pathAddress;
     ...
     ...
    public:
      void open(const std::string address);
      void close();
      void setPathAddress(const std::string newPathAddress);
};
//Defining file 

void CommandParser::open(const std::string address)
{
    inFile.open(address);
    if(!inFile.fail())
    {
        throw std::runtime_error("Invalid path! \n");
    }
    else
    {
        setPathAddress(address); 
        std::cout << "Successfully opened the file ! \n";
        parseFile();
    }
}

void CommandParser::close()
{

    if (inFile.is_open()) 
    {
        inFile.close();
        std::cout << "Successfully closed file! \n";
    }
   else
       std::cerr << "You didn't open a file ! \n";
}

如果操作失败则设置失败标志 - 因此如果您成功打开文件则不会设置它(除非之前已经设置)。

所以最好的情况是 !inFile.fail(),但是你扔了那个...相反,你需要:

if( inFile.fail())
// ^ negation dropped!
{
    // error
}
else
{
    // success
}

或者更简单一点:

if(inFile)
{
    // success
}
else
{
    // error
}

旁注:您应该通过 const reference 接受字符串(否则,const 无论如何都是无意义的...):

void open(const std::string& address);
//                         ^