2014-10-02 90 views
3

好的,我對編程不是很有經驗,但是我有一個任務來創建一個使用數值方法計算三種物質混合物溫度的C++程序,對混合物中每種物質的焓和百分比。它基本上是一個多項式h = a1 * T + a2 * T^2 + ...直到a6。這些係數a1到a6在表格中給出,對於H20,H2和O2中的每一個。我的程序需要能夠從.dat文件中讀取物質名稱和係數值,以便我可以將係數用於我的等式。這是我需要幫助的。我怎樣才能讓程序將物質名稱和係數值輸入到一個數組中,以便我可以在我的方程中使用它們?對小說不好意思,但我儘可能地給出了儘可能多的上下文。下面的 正是我的.dat文件中的內容,以及我想要放入數組中的內容。該物質的名稱,其次爲A1,A2,等將單詞和數字文件輸入到數組中C++

 
H2O 406598.40 440.77751 -.12006604  .000015305539 -.00000000072544769 -4475789700 

H2 50815.714 9.9343506 -.000027849704 -.00000035332966 .000000000041898079 -14329128 

O2 961091.64 199.15972 -.052736240  .00000897950410 -.00000000063609681 -318699310 

這是我的源代碼,到目前爲止,但它不工作,我敢丟失。

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

int main() 
{ 
double myArray[21]; 

ifstream file("thermo2.dat"); 

if (file.is_open()) 
{ 
    for (int i = 0; i < 21; ++i) 
    { 
      file >> myArray[i]; 
    } 
} 
else 
{ 
    cout << "the file did not open"; 
} 

for (int i = 0; i < 21; ++i) 
    { 
     cout << "  " << myArray[i]; 
    } 

return 0; 
} 

謝謝!

編輯:開始嘗試使用結構數組....我一直得到一個錯誤:沒有匹配函數調用'getline(std :: ifstream &,double &,char)'。繼承人的代碼:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 

using namespace std; 

struct Data 
{ 
    string species; 
    double a1, a2, a3, a4, a5, a6; 
}; 

int main() 
{ 
ifstream fin; 

fin.open("thermo2.dat"); 

if (fin.fail()) 
{ 
    cout << "Failed to open file" << endl; 
} 


Data * database = new Data[3]; 
string line; 

for(int i = 0; i < 3; i++) 
{ 


    getline(fin, database[i].species, '\t'); 
    getline(fin, database[i].a1, '\t'); 
    getline(fin, database[i].a2, '\t'); 
    getline(fin, database[i].a3, '\t'); 
    getline(fin, database[i].a4, '\t'); 
    getline(fin, database[i].a5, '\t'); 
    getline(fin, database[i].a6, '\t'); 
} 


system("pause"); 


return 0; 
} 
+0

首先決定要如何存儲數據。你想要一個還是三個?你需要文件中的物質名稱嗎?如果是這樣,你想如何存儲*他們?* – Beta 2014-10-02 04:21:55

+0

我想使用一個結構數組,但我努力讓它工作,如果你可以看看我發佈的編輯並提供任何見解'太好了! – 2014-10-03 02:33:03

回答

2

聲明你的結構:

struct Data 
{ 
    string species; 
    double a[6]; 
} 

並如下解讀:

for(int i = 0; i < 3; i++) { 
fin >> database[i].species; 
for (int j = 0; j < 6; j++) { 
    fin >> database[i].a[j]; 
} 
} 
+0

謝謝!這幫了很大的忙! – 2014-10-03 05:30:17

+0

@ t.m如果這對你有用,你可以接受嗎? – 2014-10-03 09:43:30

0

我的建議:

  1. 創建一個struct來保存數據對每種材料。

    struct Material 
    { 
        std::string name; 
        double coeffcients[6]; 
    }; 
    
  2. 創建一個函數來讀取一個流一個Material

    std::istream& operator>>(std::istream& in, Material& mat) 
    { 
        // Read the name. 
        in >> mat.name; 
    
        // If there was an error, return. 
        // Let the calling function deal with errors. 
        if (!in) 
        { 
         return in; 
        } 
    
        // Read the coefficients. 
        for (int i = 0; i < 6; ++i) 
        { 
         in >> mat.coefficients[i]; 
         if (!in) 
         { 
          return in; 
         } 
        } 
        return in; 
    }; 
    
  3. main功能,寫驅動代碼。

    int main() 
    { 
        // Create a vector of materials. 
        std::vector<Material> materials; 
    
        // Open the input file. 
        ifstream file("thermo2.dat"); 
    
        // Read Materials the file in a loop and 
        // add them to the vector. 
        Material mat; 
        while (file >> mat) 
        { 
         materials.push_back(mat); 
        } 
    
        // Now use the vector of Materials anyway you like. 
    
    
        // Done with main. 
        return 0; 
    } 
    
+0

在我意識到你回覆之前,我試圖讓它與一個結構一起工作。有什麼辦法可以使它以這種方式工作嗎?我不斷收到a1 - a6的所有提示信息。生病發布我的當前代碼作爲編輯 – 2014-10-03 02:01:42

+0

'getline'不能用於讀取'double'。爲此使用'operator >>'。 – 2014-10-03 02:35:51

相關問題