我有一个如下格式的文件:
3 // num of tasks in taskset1
1 2 3 //priority for each task
10 20 30 //exec time, deadline , period
23 34.5 45
23 56 98
4 // num of tasks in taskset2
1 2 4 3//priority for each task
10 20 30 //exec time, deadline , period
23 34.5 45
23 56 98
34 54 100
......我需要将文本文件直接读入一个结构对象taskset。
struct tasks
{
double wcet;
double deadline;
double period;
int priority;
};
struct tasksets
{
tasks task[100];
double num_tasks;
} taskset[100];我将内容存储在一个数组中,然后存储到对象中,这很好用。但是由于我的文件太大,我的程序就会被终止。我需要做的就是不使用巨大的数组。而不是100个不同的对象,只需为taskset使用一个对象。对如何做有什么建议吗?
int main(int argc, char* argv[])
{
double aa[1000][1000];
int u = 0;
int v = 0;
int i = 0;
int j = 0;
int k = 0;
string temp; // a temporary variable used to store string data
vector<vector<string>> tokens;
while (getline(cin, temp))
{
v = 0;
istringstream iss(temp);
vector<string> tokens_in_line;
while (iss >> temp)
{
double temp1 = atof(temp.c_str());
aa[u][v] = temp1;
v++;
tokens_in_line.push_back(temp);
}
u++;
if (!tokens_in_line.empty())
{
tokens.push_back(tokens_in_line);
}
}
cout << "Execution started" << endl;
for (i = 0; i < u; i = i + j)
{
cout << "Task set #" << setnum << endl;
taskset[setnum].num_tasks = aa[i][0];
cout << "Number of tasks: " << taskset[setnum].num_tasks << endl;
for (k = 0; k < taskset[setnum].num_tasks; k++)
{
taskset[setnum].task[k].priority = aa[i + 1][k];
taskset[setnum].task[k].wcet = aa[i + 2 + k][0];
taskset[setnum].task[k].deadline = aa[i + 2 + k][1];
taskset[setnum].task[k].period = aa[i + 2 + k][2];
cout << "Task " << k + 1 << ":";
cout << " Priority : " << taskset[setnum].task[k].priority;
cout << " WCET : " << taskset[setnum].task[k].wcet;
cout << " Deadline : " << taskset[setnum].task[k].deadline;
cout << " Period : " << taskset[setnum].task[k].period << endl;
}
j = k + 2;
setnum++;
}
return 0;
}发布于 2014-03-02 10:39:14
是的,你可以用操作符>>直接读入类的变量。使用getline读取每个变量。我之前使用的代码是下面的代码,让你看看它是如何完成的。基本上,你想用那些需要读入的变量创建一个类,然后你想在类或main中实例化它,然后读取文件,然后以这种方式添加每个变量。见下文,其中p是带有变量的实例化类。
string STRING;
string floor;
string toFloor;
ifstream infile;
infile.open("passenger requests.txt");
if (!infile)
{
cout << "no good file failed! \n" << endl;
}
while (infile.good())
{
for (int i = 0; i < 49; ++i)
{
getline(infile, STRING);
//Saves the line in STRING.
infile >> p[i].time;
getline(infile, floor, ',');
infile >> p[i].fromFloor;
getline(infile, toFloor, ',');
infile >> p[i].toFloor;
}
}
infile.close();
}发布于 2014-03-02 10:56:07
正如Josh已经指出的,您可以直接将令牌读入变量,而不是将它们存储在aa中。顺便说一句,对于整数标记来说,aa是一个双精度数组并不是一个很好的选择。
关于使用固定大小的数组和使您的程序在太大的输入集上崩溃的问题,我会为tasksets使用std::list或std::vector,并根据需要附加新对象。
最后,您的代码没有按照提供的方式进行编译,我必须为setnum和必要的头文件添加一个声明。
发布于 2014-03-02 10:59:48
我在你的格式中看到的主要问题-你必须读取任务集中所有任务的所有优先级,然后才能实际读取任务,如果你可以更改格式以将每个任务的优先级存储在其他详细信息所在的同一行-这样会更好,不管怎样,这是一个比原始版本使用更少内存的版本:
struct task {
double wcet;
double deadline;
double period;
int priority;
};
int main(int, char**) {
task currentTask;
std::string temp; // a temporary variable used to store string data
while (std::getline(std::cin, temp)) {
const int taskCount = atoi(temp.c_str()); // read number of tasks
// parse task priorities
int* priorities = new int[taskCount];
for (int i=0; i<taskCount; i++)
std::cin >> priorities[i];
// read actual tasks
for (int i=0; i<taskCount; i++) {
std::cin >> currentTask.wcet;
std::cin >> currentTask.deadline;
std::cin >> currentTask.period;
currentTask.priority = priorities[i];
std::cout << "Task " << (i + 1) << ":";
std::cout << " Priority : " << currentTask.priority;
std::cout << " WCET : " << currentTask.wcet;
std::cout << " Deadline : " << currentTask.deadline;
std::cout << " Period : " << currentTask.period << std::endl;
}
delete[] priorities;
}
return 0;
}https://stackoverflow.com/questions/22123046
复制相似问题