2013-12-18 47 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之间。在使用该值之前,您需要正确解析它,但这样可以避免数据的任何含糊不清。