【问题标题】:Reading from a file into an object?从文件读入对象?
【发布时间】:2014-04-03 02:25:42
【问题描述】:

我有一个格式为:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      正如 Josh 已经指出的,您可以将令牌直接读入变量中,而不是将它们存储在 aa 中。顺便说一句,aa 作为数组的双数组无论如何都不是整数标记的好选择。

      关于使用固定大小的数组以及因输入集太大而导致程序崩溃,我会改为使用std::liststd::vector 来代替tasksets,并根据需要添加新对象。

      最后,您的代码没有按照提供的方式编译,我必须添加 setnum 的声明和必要的标头。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-26
          相关资源
          最近更新 更多