我想这应该是可能的。我试过但找不到一个好的答案。我基本上想制作一个动态结构。我想读取一个文件,它告诉我我的结构将包含的数据类型。基于这些价值观,我想建立一个结构。我想为此使用 C++。我们可以将 oracle 视为一个示例,我们提供一个 csv 文件,它会识别它们应该是什么类型并制作该特定数据类型的列。
谁能帮我解决这个问题?
更新:我想我应该添加一点代码来解释我的问题陈述。所以我们开始:
//PLC Data Block Sturcture.
//Todo: try to construct this structure from a file or something
struct MMSDataHeader{
bool bHeader_Trigger; //2
unsigned char MachineTimeStamp[8]; //8
std::string Header_MachineID; //12
std::string Header_Station; //12
int Header_MessageID; //2
int Header_MessageSequenceNo; //2
int Header_NumberOfProperties; //2
int MeasurementType; //2
bool Response_Acknowledge; //2
};
typedef struct MMSDataHeader MMSDataHeader;
int PLCBox::GetHeader(){
MMSDataHeader local_PLCData = { 0 };
int res = -1;
std::cout << "Reading Head :";
if ((p_s7Client_ == NULL)) {
std::cerr << "TSnap7Client is not connected.\n";
}
res = p_s7Client_->DBRead(nb_db_num_, 0, k_header_size, (void *)(&buffer_));
//synchronous mode: default mode
//inFile.read(buffer_, sizeof(buffer_));
memcpy(&local_PLCData.bHeader_Trigger, buffer_, 1);
memcpy(local_PLCData.MachineTimeStamp, buffer_ + 2, 8);
memcpy(&local_PLCData.Header_MachineID, buffer_ + 10, 12);
memcpy(&local_PLCData.Header_Station, buffer_ + 22, 12);
memcpy(&local_PLCData.Header_MessageID, buffer_ + 34, 2);
memcpy(&local_PLCData.Header_MessageSequenceNo, buffer_ + 36, 2);
memcpy(&local_PLCData.Header_NumberOfProperties, buffer_ + 39, 2);
memcpy(&local_PLCData.MeasurementType, buffer_ + 40, 2);
memcpy(&local_PLCData.Response_Acknowledge, buffer_ + 42, 1);
nb_props = local_PLCData.Header_NumberOfProperties;
_b_read_trigger = local_PLCData.bHeader_Trigger;
return local_PLCData.Header_NumberOfProperties;
}
这段代码现在对我有用,并在我调用 GetHeader 时解决了我的目的。正如大家所见,它正在从 PLC 中寻找准确的字节和结构。我想制作一个系统,以便可以从一个文件中制作结构,这样只有一个文件应该被替换,然后系统应该自己工作。我想我可以探索一些关于工厂设计模式的事情来做到这一点。现在我可以确定我的数据结构构造的文件类型和文件内容。有没有人在那边做过类似的事情。