【发布时间】:2012-12-20 06:26:16
【问题描述】:
基本问题:
如果我正在记录/修改数据,我是否应该通过索引硬编码索引访问文件的元素,即targetFile.getElement(5);通过硬编码标识符(内部转换为索引),即target.getElementWithID("Desired Element"),或带有一些中间的DESIRED_ELEMENT = 5; ... target.getElement(DESIRED_ELEMENT),等等。
编辑:或者使用enum ??
背景:
我的程序 (c++) 将数据存储在许多不同的 'dataFile's 中。我还在 another 文件中保留了所有数据文件的列表——一个 'listFile'——它还存储了每个文件的一些属性(见下文,但即它的名称是什么,它有多少行信息等)。有一个对象管理数据文件和列表文件,称之为'fileKeeper'。
listFile 的条目类似于:
filename , contents name , number of lines , some more numbers ...
我绝对有可能从这个列表中添加/删除字段 --- 但一般来说,它们会保持静态。
现在,我有一个常量字符串数组,它保存每个条目中每个元素的标识,例如:
const string fileKeeper::idKeys[] = { "FileName" , "Contents" , "NumLines" ... };
const int fileKeeper::idKeysNum = 6; // 6 - for example
我正在尝试以“良好”的程序形式管理这些东西。因此,当我想检索文件中的行数时(例如),而不是使用仅检索“3”元素的方法...相反,我会执行以下操作:
string desiredID = "NumLines";
int desiredIndex = indexForID(desiredID);
string desiredElement = elementForIndex(desiredIndex);
函数indexForID() 遍历idKeys 的条目直到找到desiredID 然后返回它对应的索引。而elementForIndex(index) 实际上进入 listFile 以检索逗号分隔字符串的第 index 个元素。
问题:
这看起来仍然很丑/糟糕的形式。有一种我应该这样做的方式吗?如果不是,通常有哪些一般的方法?
谢谢!
【问题讨论】:
-
这似乎是 list 而不是您需要组织的 tabular 数据。 IE。您想通过键访问完整的字符串,而不是像数据库中那样的表的单独字段。因此,您必须根据数据访问的类型选择最合适的结构。如果您经常插入/删除,它可以是 std::list ,或者在大多数情况下您需要访问某个键时它可以是字符串的 std::vector ,或者它可以是 CodeChords 人建议的 std::map 如果您想访问单独的字段。最后,按照 Karthik T 的建议在课堂上组织它。