首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一个文件读取到一个对象?

从一个文件读取到一个对象?
EN

Stack Overflow用户
提问于 2014-03-02 10:16:35
回答 3查看 84关注 0票数 0

我有一个如下格式的文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
struct tasks
{
    double wcet;
    double deadline;
    double period;
    int priority;
};

struct tasksets
{
    tasks task[100];
    double num_tasks;
} taskset[100];

我将内容存储在一个数组中,然后存储到对象中,这很好用。但是由于我的文件太大,我的程序就会被终止。我需要做的就是不使用巨大的数组。而不是100个不同的对象,只需为taskset使用一个对象。对如何做有什么建议吗?

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

发布于 2014-03-02 10:39:14

是的,你可以用操作符>>直接读入类的变量。使用getline读取每个变量。我之前使用的代码是下面的代码,让你看看它是如何完成的。基本上,你想用那些需要读入的变量创建一个类,然后你想在类或main中实例化它,然后读取文件,然后以这种方式添加每个变量。见下文,其中p是带有变量的实例化类。

代码语言:javascript
复制
 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();
}
票数 0
EN

Stack Overflow用户

发布于 2014-03-02 10:56:07

正如Josh已经指出的,您可以直接将令牌读入变量,而不是将它们存储在aa中。顺便说一句,对于整数标记来说,aa是一个双精度数组并不是一个很好的选择。

关于使用固定大小的数组和使您的程序在太大的输入集上崩溃的问题,我会为tasksets使用std::liststd::vector,并根据需要附加新对象。

最后,您的代码没有按照提供的方式进行编译,我必须为setnum和必要的头文件添加一个声明。

票数 0
EN

Stack Overflow用户

发布于 2014-03-02 10:59:48

我在你的格式中看到的主要问题-你必须读取任务集中所有任务的所有优先级,然后才能实际读取任务,如果你可以更改格式以将每个任务的优先级存储在其他详细信息所在的同一行-这样会更好,不管怎样,这是一个比原始版本使用更少内存的版本:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22123046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档