【问题标题】:Store multiple types of data from file从文件中存储多种类型的数据
【发布时间】:2018-07-03 20:20:22
【问题描述】:

有人可以帮助我完成以下请求吗:

我有一个文件只有一行,其中包含以下由空格分隔的组

  • 实数
  • 整数
  • 十六进制数
  • 字符“N”

这里有一些例子:

    0 0.3 -1 +3 0xc 'N'

    2.12211 1 -100 'N' 0xac 'N'

基本上第一行可能包含实数,整数,十六进制数,字符'N',每个组之间用空格分隔

有什么方法可以创建一个包含由空格分隔的元素的多种类型的向量(在 C 中,而不是在 C++ 中)(十六进制数也应转换为十进制数?

第一个例子应该是

 V[0]=0
 V[1]=0.3
 V[2]=-1
 V[3]=3
 V[4]=12
 v[5]='N'

第二个例子应该是

V[0]=2.12211   
V[1]=1
V[2]=-100
V[3]=3
V[4]='N'
v[5]=172
V[6]='N'

【问题讨论】:

  • 仅仅因为你想要一些“不在 C++ 中”的东西并不能使 C++ 标签相关

标签: c file extract store


【解决方案1】:

规则 #1:避免过早优化。

定义数据类型:

enum data_type {
    data_type_integer = 0,
    data_type_float,
    data_type_char,
    ...
};

现在定义结构来包含这些数据:

struct data {
    enum data_type data_type;
    int data_integer;
    float data_float;
    char data_char;
};

当然这会浪费一些空间,但除非您编写数据库引擎或其他东西,否则请记住规则 #1。如果它真的困扰您,请将数据(不是data_type)打包到联合中。但是如果你在 union 上犯了一个错误,它会咬你(因为编译器无法检查,例如,你存储了char 并读取了int)。

现在您有了一个类型来存储各种数据类型。

要解析它,有多种方法。我建议将每个项目读取为一个字符串,然后使用 sscanf 解析该字符串。这种两步方法的原因是您可以检查字符串内容以确定类型:如果它包含'N',它就是'N'。如果它包含'e'、'E'或'.'它是浮动的,等等。

【讨论】:

  • 如果我们结合你的结构和 Code-Apprentice 的联合,那么这应该是这个问题的最佳解决方案..对吗?
  • @AmberBeriwal 是的;但这看起来像是一个初学者的问题,我建议初学者不要使用联合(他们会咬人)。
  • 谢谢。但是我应该如何解析具有该格式的 .txt 文件的内容呢?我的想法是拥有一个大的字符数组,并存储文件中的每个元素,并用空格分隔。并且使用 ASCII 代码,我会将字符转换为数字并将其添加到双精度向量中,但我没有成功。你能按照你的想法发布一个从这种 .txt 文件格式解析的实际示例吗?
【解决方案2】:

有什么方法可以创建多种类型的向量(在 C 中,而不是在 C++ 中)

这似乎很好地使用了联合。您可以将其定义为

union data {
    float f;
    int i;
    char n;
};

现在声明一个联合数组:

union data V[20];

然后像这样填充它:

 V[0].i=0
 V[1].f=0.3
 V[2].i=-1
 V[3].i=3
 V[4].i=12
 v[5].n='N'

在解析逻辑中,您需要决定使用联合的哪个字段,以确保按照您的意图存储正确的值。

【讨论】:

  • 创建一个包含标签和并集的结构。标记可以是描述联合中内容的枚举。
  • 谢谢。但是我应该如何解析具有该格式的 .txt 文件的内容呢?我的想法是拥有一个大的字符数组,并存储文件中的每个元素,并用空格分隔。并且使用 ASCII 代码,我会将字符转换为数字并将其添加到双精度向量中,但我没有成功。你能按照你的想法发布一个从这种 .txt 文件格式解析的实际示例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2012-01-09
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多