我有一个名为 搜索元素 的可视化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;
}
答案 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等。这种方法有什么问题?如果出于某种原因,你不能使用这种方法,那么我认为你应该更好地解释你的问题,你想要实现的目标。