从文件c ++

时间:2016-05-30 20:52:09

标签: c++ file priority-queue

我有一个优先级队列和一个“事件”类,我想从一个名为agenda.txt的文件中读取,其中包括:事件的优先级,日期,年份和名称。但是当我从文件中读取时,我只得到第一个元素,并且我希望看到具有最高优先级的元素。你能帮忙吗?

  

agenda.txt
  9
  12.05
  2016
  会议
  16   13.05
  2017年
  购物
  8   12.09
  2056
  游泳
  60   45.76
  2016
  工作

这是主要的:

int main(){

char filename[50];
ifstream bucky;
cin.getline(filename,50);
bucky.open(filename);
if(!bucky.is_open()){
    exit(EXIT_FAILURE);
}
string nume;
int prio;
double data;
int an;
bucky>>prio>>data>>an>>nume;

while(bucky.good()){
cout<<"prioritatea este "<<prio<<"    data este "<<data<<"   anul este "<<an<<"   numele este  "<<nume<<" "<<endl;
bucky>>prio>>data>>an>>nume;



priority_queue<Event> q;

q.push(Event(prio,data,an,nume));


    cout<< q.top().getEventPriority()<<q.top().getEventData()<<" "<<q.top().getEventAn()<<" "<<q.top().getEventName()<<endl;



system("pause");}}

2 个答案:

答案 0 :(得分:1)

index.js不知道如何对自定义类进行排序。您的类需要覆盖小于运算符,以便priority_queue可以按文本文件中定义的优先级对项目进行排序。伪实现看起来像这样:

priority_queue

答案 1 :(得分:0)

如果我正确理解你想要的是将文件中的第一条记录作为具有最高优先级的记录;如果是这种情况,那么您应该按优先顺序写入记录,第一条记录具有最高优先级。例如,

class Event {
public:
    int priority;
    int date;
    int year;
    string name;
};

bool operator<(const Event& first, const Event& second) { 
    return first.priority < second.priority;
}

priority_queue<event> pq;

for (const auto& event : events_array_from_before) {
    pq.push(event);
}

ofstream fout;
fout.open("agenda.txt");
if (!fout) {
    cerr << "Could not open file to write to" << endl;
    return 1;
}

while (!pq.empty()) {
    const auto& event = pq.top();
    pq.pop();
    fout << event.priority << '\n' << event.date << '\n' 
         << event.year << '\n' << event.name << '\n';
}

但是如果你的文件中包含一些随机顺序的记录,你就无能为力(如果使用优先级队列),而是读取所有记录并跟踪具有最高优先级的记录。所以你会做以下

ifstream fin;
fin.open("agenda.txt");
if (!fin) { 
    cerr << "Could not open file agenda.txt" << endl;
    return 1;
}

Event temp;
Event top_record;
fin >> top_record.priority >> top_record.date >> top_record.year 
    >> top_record.name;
while (fin >> temp.priority >> temp.date >> temp.year >> temp.name) {
    if (temp.priority > top_record.priority) {
        top_record = std::move(temp); // for efficient moving of string name
    }
}

如果您希望文件中的所有记录按排序顺序排列,则必须将所有记录都读入vector并在std::sort上调用vector方法

如果你有一些关于元素在文件中的位置的指示,你可以在ifstream对象中打开文件,然后调用对象上的seekg方法从该点开始读取。< / p>