我正和朋友一起做一个简单的程序。我写了一些I / O函数来插入程序(它们只读取/写入txt文件)。我打算将它们添加到头文件中以包含在主程序中。
该程序通过执行一些CRUD操作来管理项目集合。目前,它只存储在内存中。有3种不同的结构(用于表示不同类型的对象)和3种向量(每种结构类型一种)来表示3个集合。
对于不同结构类型的每个向量(在本例中我称之为t_item),我创建了三个I / O函数:
void serialize_item(const string &file_name, t_item &an_item)
声明一个ofstream变量,并将每个项目字段(ios :: app)附加到txt文件。然后调用file.close()
void serialize_all_items(const string &file_name, vector<t_item> &items)
声明一个ofstream变量并覆盖(ios :: trunc)文件内容。迭代向量,将每个struct字段写入txt文件。然后调用file.close()
void deserialize_items(const string &file_name, vector<t_item> &items)
声明本地t_item变量和ifstream变量。在读取文件内容并将每个项目字段保存到t_item变量时迭代。当一个项目完成时,它会调用push_back将其保存到向量中并返回到从文件中读取下一个项目。然后调用file.close()
问题是:我和我的朋友分别在代码的不同部分工作。由于他声明了所有的结构,他必须决定每个结构使用什么名称以及字段的名称(虽然我们都同意每个结构中会有一定数量的字段,但它们属于某种类型,因为这是我们需要实现的设计。)
我现在的问题是:我有没有办法在不知道他使用的结构和字段名称的情况下实现I / O功能?例如,这个函数:
void serialize_person(const string &file_name, type_person &a_person)
{
ofstream personsFile(file_name, ios::app);
personsFile<< a_person.name << endl;
personsFile<< a_person.age << endl;
personsFile<< a_person.gender << endl;
personsFile.close();
}
我的朋友可以选择将结构命名为“onePerson”而不是“type_person”,字段可以是“fullName”,“age”,“sex”。但结构几乎相同。
尽管其他程序员选择了结构/字段名称,我如何调整I / O函数以适应相同的结构?
答案 0 :(得分:0)
你能用联盟吗?您可以避免引用每个变量而不是...数组?
例如:
#include <stdio.h>
union myStrings
{
struct fields
{
char *name;
char *age;
char *gender;
} myFields;
char *arrayPointers[3];
};
int main (void)
{
char name[] = "David";
char age[] = "38";
char gender[] = "Male";
myStrings st;
st.myFields.name = name;
st.myFields.age = age;
st.myFields.gender = gender;
for( int i = 0 ; i < 3 ; i++ )
printf( "%s\n", st.arrayPointers[i] );
return 0;
}
结果(不使用任何名称):
David
38
Male