从文件读取到对象?

时间:2014-03-02 02:16:35

标签: c++ arrays object file-io struct

我有一个格式为的文件:

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

3 个答案:

答案 0 :(得分:0)

是的,您可以使用运算符&gt;&gt;直接读取类的变量。使用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();
}

答案 1 :(得分:0)

正如乔希已经指出的那样,你可以直接将你的标记读入变量,而不是将它们存储在aa中。顺便说一句,aa是一个双数组数组,不管怎么说都不是你的整数标记的好选择。

关于使用固定大小的数组并使程序因过大的输入集而崩溃,我会为std::list寻找std::vectortasksets并添加新对象根据需要。

最后,您的代码无法按提供的方式进行编译,我必须为setnum添加声明和必要的标题。

答案 2 :(得分:0)

我在您的格式中看到的主要问题 - 您必须在实际读取任务之前读取任务集中所有任务的所有优先级,如果您可以更改格式以存储其他详细信息所在的同一行的每个任务的优先级 - 它会更好,无论如何这里的版本使用的内存比原来的版本少:

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