Неисправность перегрузки оператора извлечения для пользовательских PriorityQueue

Я пытаюсь перегрузить operator>> для обычая 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 вход однако это не работает для fstream вход — самый первый getline всегда читает пустую строку из ввода, так что while цикл никогда не срабатывает, и я не могу пропустить его (я пытался с inStream.ignore() как вы можете видеть выше, но это не работает.

Редактировать:

В настоящее время я просто хочу, чтобы он работал для ввода файлов, игнорируя тот факт, что он работает только для 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» — это формат файла примера выше.

Изменить: более простой пример

Код:

#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

Решение

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

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

Другие решения

Других решений пока нет …