难以在c ++中读取二进制文件

时间:2013-12-18 15:37:30

标签: c++ binaryfiles

我有一个名为 搜索元素 的可视化c ++项目,其中有一个名为 PeriodicTable 的类,我有另一个名为 写元素 的可视化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;
}

3 个答案:

答案 0 :(得分:3)

您没有正确执行类抽象。更重要的是,同一档案中的所有内容?包括类定义?这不是你使用VS项目结构的方式。

我假设您要创建两个单独的应用程序。一个是创建周期表,第二个应用程序使用第一个应用程序生成的文件。

如果以上是正确的,则需要在头文件中声明PeriodicTable类,在.cpp实现中实现构造函数,析构函数和GetInfo方法。另一个.cpp实现应该包含第一个应用程序的main()函数。

请注意,通过两个包含全局定义的应用程序(如生成的.dat文件的路径)在共享位置创建通用头文件通常是个好主意。在这种情况下,应该采用绝对路径,因为两个应用程序不太可能具有相同的文件相对路径。

需要注意的另一件事是,不要让编译器弄清楚文件应该如何构造,而是自己构建它。遵循您在两个应用程序中创建的结构约定。一个建议是,不是写(char *) &ptele,而是为一个元素写一行,在每列之间给出一个标签,比如Element和Symbol之间。在使用该值之前,您需要正确地解析它,但这样可以避免数据的任何歧义。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

我认为你没有正确使用VS项目结构。乍一看,你的简单解决方案应该包含一个包含一个类(PeriodicTable)的项目,这个类应该有几个方法,例如searchElements,writeElements,readElements等。这种方法有什么问题?如果出于某种原因,你不能使用这种方法,那么我认为你应该更好地解释你的问题,你想要实现的目标。