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

时间:2019-06-17 17:49:36

标签: c++ ifstream

我正在从事一个涉及解析XML文档的项目,我需要创建一个对文件起作用的打开和关闭函数。我有一个具有ifstream对象的类,并且两个函数使用同一对象关闭和打开。 问题在于,在打开功能中,对象默认情况下处于关闭状态,直到程序达到关闭功能,它始终返回。即使打开了文件,您也没有打开文件。 有没有一种方法可以使对象成为全局对象以便创建它,使其可以同时在两个函数中工作? 任何建议表示赞赏

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

1 个答案:

答案 0 :(得分:1)

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

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

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

或更简单:

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

旁注:您应该通过const reference 接受字符串(否则const毫无意义...):

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