从文件读取到对象

Reading from a file into an object?

本文关键字:对象 读取 文件      更新时间:2023-10-16

我有一个格式的文件:

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::liststd::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;
}