Как манипулировать объектом ifstream в нескольких функциях - PullRequest
0 голосов
/ 17 июня 2019

Я работаю над проектом, который включает анализ XML-документа, и мне нужно создать функцию открытия и закрытия, которая работает с файлами.У меня есть класс, который имеет объект ifstream и две функции закрытия и открытия, которые используют один и тот же объект.Проблема в том, что в функции open объект по умолчанию закрывается, и до тех пор, пока программы не достигнут функции закрытия, он всегда возвращает. Вы не открывали файл, даже если файл открыт. Есть ли способ сделать объектглобальный объект для того, чтобы создать его, чтобы он мог работать в обеих функциях?Любые предложения приветствуются

 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 Ответ

1 голос
/ 17 июня 2019

Флаг сбоя устанавливается в случае сбоя операции - поэтому он не будет установлен, если вы успешно откроете файл (если он не был установлен ранее).

Таким образом, хороший случай - !inFile.fail(),но вы добавляете это ... Вместо этого вам понадобится:

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

Или немного проще:

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

Примечание: вы должны принимать строки по const ссылка (в противном случае const все равно не имеет смысла ...):

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