2013-12-18 79 views
-2

我有一個名爲Visual C++項目搜索元素其中有一個叫元素週期表類和我還有一個Visual C++項目稱爲寫部件其中有這個相同的類,它的描述(變量名和它們的大小)是相同的太...閱讀困難的二進制文件在C++中

我使用寫元件項目的類元素週期表的對象寫入名爲PeriodicTable.dat但每當我用的是二進制文件,我搜索元素項目(基本上是複製粘貼從二進制文件寫入元素搜索元素),那麼輸出是意想不到的(包含垃圾值)。

在我看來,該文件應該與兩個項目一起工作,因爲兩個項目都包含相同的類別描述。但我不知道是什麼問題?

寫部件編號:

#include <iostream> 
#include <fstream> 

using namespace std; 

class PeriodicTable 
{ 
    char Name[15], Symbol[3], Block, State[10], Colour[15], Classification[20]; 
    int GroupNo, AtomicNo, PeriodNo; 
    float Weight; 

    public: 

    void GetInfo(); 
}; 

int main() 
{ 
    PeriodicTable ptele; 
    ofstream fileout; 

    fileout.open("PeriodicTable.dat", ios::binary | ios::app); 

    system("cls"); 
    ptele.GetInfo(); 
    fileout.write((char *)&ptele, sizeof(ptele)); 

    fileout.close(); 

    return 0; 
} 

void PeriodicTable::GetInfo() 
{ 
    cout << "Full Name of the element: "; 
    cin >> Name; 
    cout << "Symbol: "; 
    cin >> Symbol; 
    cout << "Block: "; 
    cin >> Block; 
    cout << "State(at Room Temperature): "; 
    cin >> State; 
    cout << "Colour: "; 
    cin >> Colour; 
    cout << "Classification: "; 
    cin >> Classification; 
    cout << "Group Number: "; 
    cin >> GroupNo; 
    cout << "Atomic Number: "; 
    cin >> AtomicNo; 
    cout << "Period Number: "; 
    cin >> PeriodNo; 
    cout << "Atomic Weight: "; 
    cin >> Weight; 
} 
+1

你能提供'WriteElements'代碼示例? – Johan

+0

此外,Visual Studio暗示Windows - 您使用什麼來執行文件讀取/寫入?例如,如果您使用fopen,則必須格外小心,以免它在錯誤的時刻翻譯行結尾。 –

+0

這是我第一次看到具有這種命名約定的Visual C++項目。這是...令人不安的... – SirDarius

回答

2

它完美對我的作品具有以下讀代碼:

int Read() 
{ 
    ifstream file; 
    file.open("PeriodicTable.dat", ios::binary | ios::in); 

    while (0 == file.rdstate()) 
    { 
     PeriodicTable ptele; 
     file.read((char *)&ptele, sizeof(ptele)); 
     //if (0 == file.rdstate()) 
     // ptele.PrintInfo(); 
    } 
    file.close(); 

    return 0; 
} 
1

我不認爲你正確使用VS項目結構。初看起來,您的簡單解決方案應該包含一個包含一個類的項目(PeriodicTable),並且該類應該有幾個方法,例如searchElements,writeElements,readElements等。這種方法有什麼問題?如果出於某種原因,你不能使用這種方法,那麼我認爲你應該更好地解釋你的問題,你試圖達到的目標。

+0

好吧看!對不起,如果我粗魯...但我想使用我使用_ **寫入元素項目** _創建的二進制文件,並使用它與_ **搜索元素** _項目具有相同的類描述... – radiantshaw

+0

我回復了你的第一個版本,你甚至沒有提供你的代碼,所以我非常困惑,試圖表達你想要做的事情。看到周圍的其他評論我顯然不是唯一的評論。如果你想得到答案,你需要首先發佈一個好問題。對你沒有想到的答案粗魯或緊張不會有幫助。 –

3

您沒有正確執行類抽象。還有更多,所有文件都在同一個文件中?包括類定義?這不是你如何使用VS項目結構。

我假設你想創建兩個單獨的應用程序。一個會創建週期表,第二個應用程序使用第一個應用程序生成的文件。

如果上述內容正確,您需要在.cpp實現中聲明PeriodicTable類的頭文件,實現構造函數,析構函數和GetInfo方法。另一個.cpp實現應該包含第一個應用程序的main()函數。

請注意,在包含全局定義的兩個應用程序(如生成的.dat文件的路徑)的共享位置創建通用頭文件通常是一個好主意。在這種情況下,應該採用絕對路徑,因爲這兩個應用程序不可能具有與文件相同的相對路徑。

另一件需要注意的事情是,不要讓編譯器弄清楚應該如何構造文件,自己構造它。遵循您在這兩個應用程序中創建的結構約定。一個建議是,不要寫(char *) &ptele,要爲一個元素寫一行,在每一列之間給出一個標籤,比如在Element和Symbol之間。在使用該值之前,您需要正確解析它,但這樣可以避免數據的任何含糊不清。