有人可以帮我处理以下请求:
我的文件中只有一行包含以空格分隔的以下组
以下是一些例子:
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'
答案 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'
在解析逻辑中,您需要决定使用哪个联合字段,以确保按照您的意图存储正确的值。