2015-05-27 35 views
0

我是StackExchange和C++的新手,很抱歉,如果我沒有足夠好地描述問題。我需要一些幫助做功課。 我試圖找到一種方法來加載此文件並存儲其數據。該文件具有不同的數據類型,所以到目前爲止我想到的是使用struct數組來存儲所有的值,使用三重嵌套for循環將數據保存在正確的變量中。從文本文件加載不同的數據類型

以下是.dat文件的外觀,用「註釋」來幫助描述正在發生的事情。

100A 2  // model number, 2 different versions of that model 

0 0 0  // number of quarters, dimes, and nickels 

5   //number of items in the vending machine 

1A 1034 5 // Code combonation, ID Number, Quantity 

1B 1000 10 

1C 1100 10 

1D 1123 20 

1E 1222 5 

0 0 0  // number of quarter, dimes, nickels in 2nd model 

7   // number of items in the second version of that model 

1A 2180 20 

1B 1283 20 

1C 3629 5 

1D 3649 3 

1E 4051 15 

1F 4211 1 

1G 5318 5 

100B 3  // New model, with 3 different versions of itself. 

2 10 5  //everything repeats like model 100A 

7 

這裏是我想出了

#include <fstream> 
#include <iostream> 
#include <iomanip> 
#include <string> 
using namespace std; 

struct VMdata 
{ 
    ifstream inFile; 
    string model[1]; 
    int version[1]; 
    int q[5]; 
    int d[5]; 
    int n[5]; 
    int size[5]; 
    string id[30]; 
    int code[30]; 
    int num[30]; 
    char dummy; 
}; 

int main() 
{ 

    VMdata New; 

    cout << fixed << setprecision(2) << showpoint; 

    New.inFile.open("machines.dat"); 



    cout << "Model Data" 
      << endl << endl;  



    int count1 = 0; 
    int count2= 0; 
    int count3 = 0; 
    for (int i = 0; i < 2; i ++) 
    { 
     cout << "i :" << count1 << endl; 
     New.inFile >> New.model[i] >> New.version[i]; // loads model number and number of versions i times 
     count1 = count1 + 1; 
     for (int j = 0; j < New.version[count1 -1]; j ++) 
     { 
      cout <<"j :" << count2 << endl; 
     New.inFile >> New.q[count2] >> New.d[count2] >> New.n[count2] >> New.size[count2]; // loads number of q, d, n, j times 
     count2 = count2 + 1; 
     for (int k = 0; k < New.size[count2 - 1]; k++) 
     { 
      cout << "k :" << count3 << endl; 
      New.inFile >> New.id[count3] >> New.code[count3] >> New.num[count3]; // loads id number, code number, and total number k times 
      count3 = count3 + 1; 
     } 

     } 
    } 
    New.inFile.close(); 

    count1 = 0; 
    count2= 0; 
    count3 = 0; 
    cout << endl; 

     for (int i = 0; i < 2; i ++) 
    { 
     cout << New.model[i] << setw(12) << New.version[i] << endl << endl; 
     count1 = count1 + 1; 
     for (int j = 0; j < New.version[count1 -1]; j ++) 
     { 
     cout << New.q[count2] << setw(12) << New.d[count2] << setw(12) << New.n[count2] << endl << setw(12) << New.size[count2] << endl; 
     count2 = count2 + 1; 
     for (int k = 0; k < New.size[count2 - 1]; k++) 
     { 
      cout << New.id[count3] << setw(12) << New.code[count3] << setw(12) << New.num[count3] << endl << endl; 
      count3 = count3 + 1; 
     } 

     } 
    } 



     return 0; 
} 

這裏是我的測試輸出的代碼。

100A   2 

3   15   0 // should be 0, 0, 0 

5 

1A  1034   5 

1B  1000   10 

1C  1100   10 

1D  1123   20 

1E  1222   5 

0   0   0 

    7 

1A  2180   20 

1B  1283   20 

1C  3629   5 

1D  3649   3 

1E  4051   15 

1F  4211   1 

1G  5318   5 

♥  ☻   3 // the heart and smile should be 100B lol 

2   10   5 

    7 

1A  2180   10 

1B  1283   10 

1C  3629   5 

1D  3649   3 

1E  4051   15 

1F  4211   10 

1G  3026   5 

5   6   3 

    6 

1A  6626   5 

1B  6155   5 

1C  5982   10 

1D  5573   3 

1E  5454   10 

1F  5336   50 

10   10   10 

5 

1A  1034   5 

1B  1000   5 

1C  1100   5 

1D  1123   5 

1E  1210   12 

Press any key to continue . . . 

正如你可以看到,宿舍,硬幣和鎳的數量是錯誤的,第一臺機器,並且型號名稱是錯誤的,第二個模型。 如果有人有任何建議,將不勝感激。

+1

對於這種輸入,我會將整行讀爲字符串,然後將其解析爲單獨的變量(結構)。 – Tim3880

+0

你好,你可以舉一個例子來讀一行作爲字符串,並把它放在不同的變量?我想過做這樣的事情,但我真的不知道該怎麼做,也不知道如何將字符串轉換爲int。謝謝。 – user3677752

+1

對不起,我沒有一個例子。使用getline以字符串形式讀取行,並使用boost :: split將行分割爲一個字符串向量,掃描向量中的每個元素並將其轉換爲適當的類型和目標。 – Tim3880

回答

0

它看起來像你是破壞數據。你的結構只分配一個模型和一個版本,但是i索引取值爲0和1.第二次讀入時,地址覆蓋硬幣數量。

相關問題