从文件读取到对象
Reading from a file into an object?
我有一个格式的文件:
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;
}
是的,您可以使用运算符直接读取类的变量>>. 使用 getline 读取每个变量。我之前使用的代码如下,供您查看其完成情况。基本上,您想创建一个需要读取这些变量的类,然后您想在类或主文件中实例化它,然后读取文件,然后以这种方式添加每个变量。请参阅下文,其中 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();
}
正如 Josh 已经指出的那样,您可以直接将令牌读取到变量中,而不是将它们存储在 aa
中。顺便说一句,无论如何,aa
数组的双数组对于整数令牌来说都不是一个好的选择。
关于使用固定大小的数组和为太大的输入集使程序崩溃,我会选择std::list
或std::vector
tasksets
,并根据需要附加新对象。
最后,您的代码无法按规定编译,我不得不为setnum
添加声明和必要的标头。
我在您的格式中看到的主要问题 - 您必须在实际读取任务之前读取任务集中所有任务的所有优先级,如果您可以更改格式以将每个任务的优先级存储在其他详细信息所在的同一行 - 它会更好,无论如何这里是使用比原始版本更少的内存的版本:
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;
}
相关文章:
- 如何在C++中从文件中读取/写入多个对象
- 使用对象文件读取三角形数据网格
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 我可以读取静态对象中的文件.txt吗?C++
- 从对象C++中的文件读取内容时出现分段错误
- 如何从文件中读取指向对象的指针?
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组
- 从一个文件中读取多个序列化对象
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 用rapidjson读取子对象向量
- 从文本文件中读取对象
- 使用 OpengGLES2(角度)从帧缓冲区对象读取
- C++两次从文件保存对象读取多重继承
- 通过 ifstream 对象读取C++中的文件
- 将C 对象读取到随机访问文件中
- 使用 C++ 将对象读取和写入二进制文件
- C++在尝试编写对象读取器时,在尝试从一个向量获取数据时出错
- 为什么这个ifstream无法将平面对象读取到内存中
- 如何在C++中从istream对象读取时检测空行
- C++使用fstream对象读取和写入文本文件时出现问题