0

Я пытаюсь перегружать operator>> для пользовательского класса PriorityQueue Я пишу, код ниже:Проблема перегрузки оператора извлечения для пользовательских PriorityQueue

/** 
* @brief Overloaded stream extraction operator. 
* 
* Bitshift operator>>, i.e. extraction operator. Used to write data from an input stream 
* into a targeted priority queue instance. The data is written into the queue in the format, 
* 
* \verbatim 
[item1] + "\t" + [priority1] + "\n" 
[item2] + "\t" + [priority2] + "\n" 
... 
* \endverbatim 
* 
* @todo Implement functionality for any generic Type and PriorityType. 
* @warning Only works for primitives as template types currently! 
* @param inStream Reference to input stream 
* @param targetQueue Instance of priority queue to manipulate with extraction stream 
* @return Reference to input stream containing target queue data 
*/ 
template<typename Type, typename PriorityType> std::istream& operator>>(std::istream& inStream, PriorityQueue<Type, PriorityType>& targetQueue) { 

    // vector container for input storage 
    std::vector< std::pair<Type, PriorityType> > pairVec; 
    // cache to store line input from stream 
    std::string input; 

    std::getline(inStream, input); 

    if (typeid(inStream) == typeid(std::ifstream)) { 
     inStream.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 

    // loop until empty line 
    while (!input.empty()) { 
     unsigned int first = 0; 
     // loop over input cache 
     for (unsigned int i = 0; i < input.size(); ++i) { 
      // if char at index i of cache is a tab, break from loop 
      if (input.at(i) == '\t') 
       break; 
      ++first; 
     } 
     std::string data_str = input.substr(0, first); 
     // convert from std::string to reqd Type 
     Type data = atoi(data_str.c_str()); 

     std::string priority_str = input.substr(first); 
     // convert from std::string to reqd PriorityType 
     PriorityType priority = atof(priority_str.c_str()); 

     pairVec.push_back(std::make_pair(data, priority)); 

     // get line from input stream and store in input string 
     std::getline(inStream, input); 
    } 

    // enqueue pairVec container into targetQueue 
    //targetQueue.enqueueWithPriority(pairVec); 

    return inStream; 

} 

Это в настоящее время работает для stdin или std::cin ввода, однако это Безразлично» t для ввода fstream - самый первый getline всегда читает пустую строку с входа так, что цикл while никогда не запускается, и я не могу пропустить его (я пробовал с inStream.ignore(), как вы можете видеть выше, но это не так, т.

Edit:

В настоящее время я просто хочу, чтобы он работал для ввода файла, игнорируя тот факт, что работает только для int типа данных и double типа приоритета прямо сейчас - это не имеет значения (и ни один не является фактическим манипуляции с самим объектом targetQueue).

На данный момент я просто заинтересован в разрешении пустых строк при попытке потока через ввод файлов.

Пример файла для передачи:

3 5.6 
2 6.3 
1 56.7 
12 45.1 

где числа в каждой строке \t разделены.

Пример испытание:

#include "PriorityQueue.h" 
#include <sstream> 
#include <iostream> 
#include <fstream> 

int main(void) { 

    // create pq of MAX binary heap type 
    PriorityQueue<int, double> pq(MAX); 


    std::ifstream file("test.txt"); 

    file >> pq; 

    std::cout << pq; 

} 

, где "test.txt" является в формате файл примера выше.

Edit: Simpler Пример

Код:

#include <iostream> 
#include <fstream> 
#include <vector> 

class Example { 

public: 

    Example() {} 

    size_t getSize() const { return vec.size(); } 

    friend std::istream& operator>>(std::istream& is, Example& example); 

private: 

    std::vector< std::pair<int, double> > vec; 

}; 

std::istream& operator>>(std::istream& is, Example& example) { 

    int x; 
    double y; 
    while (is >> x >> y) { 
     std::cout << "in-loop" << std::endl; 
     example.vec.push_back(std::make_pair(x, y)); 
    } 
    return is; 
} 

int main(void) { 

    Example example; 

    std::ifstream file("test.txt"); 

    file >> example; 

    file.close(); 

    std::cout << example.getSize() << std::endl; 

    return 0; 

} 
+0

Пожалуйста, предоставьте [mcve]. Что такое примерное содержимое файла, которое может потребоваться для чтения? – Barry

+0

@Barry Действительно, я добавил редактирование в OP сейчас - для повторной итерации фактической манипуляции с очередью здесь не важно, я просто хотел бы знать, как разрешить проблему с пустой строкой при чтении из ввода файла поток. – ArchbishopOfBanterbury

+0

Это часть ** минимальный ** часть. Просто удалите все ненужные вещи в код и покажите пример файла, который не выполняет то, что вы хотите. – Barry

ответ

1

Оператор уже перегружен - и должны быть перегружены - для многих типов. Пусть эти функции выполняют свою работу:

template<typename Type, typename PriorityType> 
std::istream& operator>>(std::istream& inStream, PriorityQueue<Type, PriorityType>& targetQueue) 
{ 
    std::vector< std::pair<Type, PriorityType> > pairVec; 
    Type data; 
    PriorityType priority; 

    while(inStream >> data >> priority) 
    pairVec.push_back(std::make_pair(data, priority)); 

    targetQueue.enqueueWithPriority(pairVec); 

    return inStream; 
} 
+0

Хорошо работает для' stdin' и 'std :: cin', однако это все еще не кажется для работы с потоковой передачей файлов:/ – ArchbishopOfBanterbury

+0

@ArchbishopOfBanterbury: Действительно? Я тестировал его с потоковой передачей файлов, и он работал отлично. Если вы разместите [минимальный полный пример] (http://stackoverflow.com/help/mcve), возможно, мы сможем понять это. – Beta

+0

Возможно, я являюсь идиотом и забываю, как правильно записывать поток, но теперь я проведу код с моего «главного» на OP – ArchbishopOfBanterbury