我需要解析文件并对其进行一些处理。该文件是文本文件,数据是“PP1004181350D001002003 ..........”形式的可变长度数据。所以如果有PP就会有时间戳,所以1004181350是2010-04-18 13:50。有D的那些数据点是三个独立的数据,每三个数字长,所以D001002003有三个coordonates为001,002和003。
现在我需要从一个文件中解析这个数据,我需要将每个时间戳存储到一个数组中,并将相应的数据解析成数组,其中行数与数据数相同,每行坐标数为3行。结束数组可能类似于
TimeStamp[1] = "135000", low[1] = "001", medium[1] = "002", high[1] = "003"
TimeStamp[2] = "135015", low[2] = "010", medium[2] = "012", high[2] = "013"
TimeStamp[3] = "135030", low[3] = "051", medium[3] = "052", high[3] = "043"
....
问题是如何在C中执行此操作?如何通过此字符串查找这些模式并将值存储在相应的数组中以进行进一步处理?
注意:这里时间戳中的秒值是我们自己添加的,因为每个数据在15秒后就知道了。
答案 0 :(得分:2)
编辑:已更新,符合您的规范。
虽然您的文件似乎是可变长度的,但您的数据不是,您可以使用fscanf并执行以下操作:
while(fscanf(file,"PP%*6d%4d", ×tamp, &low, &medium, &high))
{
for(int i = 0; fscanf(file, "D%3d%3d%3d", &low, &medium, &high); i++)
{
timestamp=timestamp*100+i*15;
//Do something with variables (e.g. convert to string, push into vector, ...)
}
}
请注意,这会将数据读入整数(时间戳,低,中,高都是int),字符串版本如下(时间戳,低,中,高是字符数组):
int first[] = {'0', '1', '3', '4'};
int second[] = {'0','5'};
while(fscanf(file,"PP%*6d%4c", ×tamp, &low, &medium, &high))
{
for(int i = 0; fscanf(file, "D%3c%3c%3c", &low, &medium, &high); i++)
{
timestamp[i][4]=first[i%4];
timestamp[i][2]=second[i%2];
}
}
编辑:关于格式化字符串的更多解释,%*6d
我的意思是:寻找6位数并丢弃它们(*表示:不要放入变量)。 %4d
或%4c
在此上下文中表示相同(1个数字将是一个字符),但我们会将它们保存在相应的变量中。
答案 1 :(得分:0)
更新:结帐KillianDS上面的代码。那更好!!
[第1步] 搜索/ n(或CR + LF)
[第2步] 从第一个字符开始,你知道没有。每个数据字段占用的字符数。从文件中读取许多字符。
使用 atoi()将字符数据转换为int
对所有字段重复。
答案 2 :(得分:0)
答案 3 :(得分:0)
我不建议直接在输入数据上使用fscanf,因为它对in数据非常敏感,如果一个字节错误并且突然没有格式说明符,那么在最坏的情况下你可以覆盖内存。
最好是使用fgetc和parse进入或读入缓冲区(fread)并从那里处理它。