从输入文件调度作业

时间:2015-03-06 13:36:44

标签: c++ algorithm job-scheduling

我正在为我的操作系统类工作模拟进程调度程序,并且无法确定从文件中提取数据的最佳方法。输入文件如下所示:

5
1 3 10
2 4 15
3 6 8
4 7 3
5 9 12

其中第一个数字是进程数,每行包含:(1)作业号,(2)到达时间,以及(3)CPU循环时间。

我必须使用FCFS,SJF,SRT和Round Robin处理作业。

这是我到目前为止所做的一部分,但我无法弄清楚如何从文件中获取数据,以便我可以更轻松地处理它(或者根本不是,我'马小卡住了。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct job
{
 int id, arrTime, cpuTime;
};

int main()
{
 fstream input;
 job job1, job2, job3, job4, job5, job6, job7,job8, job9, job10;
 char n, *id, *at, *cpu; 
 int proc;  

 input.open("input.txt");

 input.get(n);
 proc = n;




 return 0;
}

我正在考虑从给出的10个作业中获取每一点信息并将其放入10个作业类对象中。此外,是否有一种很好的方法以允许任意数量的作业的方式实现代码?

1 个答案:

答案 0 :(得分:0)

使用std::vector之类的容器来存储您的工作。良好的I / O是艰难而乏味的:

例如:

// container to hold jobs
// remember to #include <vector>
std::vector<job> myJobs;

然后阅读:

// read in number of jobs:
// going to need #include <fstream> and <sstream>
ifstream input("input.txt");
if (!input)
{
   std::cerr << "Failed to open input file! Cannot continue\n";
   exit(1);
}

int numJobs = 0;

if (input >> numJobs)
{
   myJobs.reserve(numJobs);
}
else
{
   std::cerr << "Failed to read number of jobs. Cannot continue\n";
   exit(1);
}

std::string nextline;
for (int i=0;i<numJobs && std::getline(input >> std::ws, nextLine); ++i)
{
   std::stringstream inStream(nextLine);
   job nextJob;

   nextLine >> nextJob.id >> nextJob.arrTime >> nextJob.cpuTime;
   if (!inStream)
   {
      std::cerr << "Error reading next job\n";
      break;
   }

   myJobs.push_back(nextJob);
}

input.close();
std::cout << "Was supposed to read in " << numJobs << " jobs. Successfully read in " << myJobs.size() << " jobs.";

然后用容器做你想做的事情:

// Now you can do what you want with them
// Let's sort them from smallest cpuTime to largest!
// remember to #include<algorithm>
std::sort(std::begin(myJobs), std::end(myJobs), [](const job& lhs, const job& rhs){return lhs.cputime < rhs.cputime;});
cout << "Jobs sorted by cputime: \n";
for (auto&& j : myJobs)
{
   cout << j.id << " " << j.arrTime << " " << j.cpuTime << std::endl;
}

编辑我在这篇文章中使用了一些C ++ 11,所以如果你只使用C ++ 98/03,它将无法编译