Я пытаюсь перегружать 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;
}
Пожалуйста, предоставьте [mcve]. Что такое примерное содержимое файла, которое может потребоваться для чтения? – Barry
@Barry Действительно, я добавил редактирование в OP сейчас - для повторной итерации фактической манипуляции с очередью здесь не важно, я просто хотел бы знать, как разрешить проблему с пустой строкой при чтении из ввода файла поток. – ArchbishopOfBanterbury
Это часть ** минимальный ** часть. Просто удалите все ненужные вещи в код и покажите пример файла, который не выполняет то, что вы хотите. – Barry