存储文件

时间:2018-01-24 17:29:23

标签: c file extract store

有人可以帮我处理以下请求:

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

  • 实数
  • 整数
  • 十六进制数字
  • 角色' 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'

2 个答案:

答案 0 :(得分:2)

规则#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'或'。'它是浮动等等。

答案 1 :(得分:1)

  

有没有办法创建多种类型的向量(在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'

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