2014-03-02 37 views
0

我有格式的文件:讀入一個對象?

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

回答

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(); 
} 
0

由於喬希已經指出,你可以直接讀取你的令牌到變量中,而不是將它們存儲在aa中。順便說一句,aa是陣列的雙陣列是不是你的整數令牌一個不錯的選擇呢。

關於使用固定大小的數組和崩潰的程序過大輸入集,我反而去爲任何一個std::liststd::vectortasksets,並根據需要追加新的對象。

最後,您的代碼不編譯所提供,我不得不添加一個聲明setnum和必要的標頭。

0

主要的問題我在您的格式見 - 你必須閱讀在taskset的所有任務所有優先級之前,你其實可以閱讀的任務,如果你能在哪裏等細節都在同一行更改格式存儲的優先級爲每個任務 - 這將是更好的,反正這裏是版本,它使用較少的內存比你原來的一個:

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