用C解析文件

时间:2010-04-18 10:58:09

标签: c string parsing

我需要解析文件并对其进行一些处理。该文件是文本文件,数据是“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秒后就知道了。

4 个答案:

答案 0 :(得分:2)

编辑:已更新,符合您的规范。

虽然您的文件似乎是可变长度的,但您的数据不是,您可以使用fscanf并执行以下操作:

while(fscanf(file,"PP%*6d%4d", &timestamp, &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", &timestamp, &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上面的代码。那更好!!

对所有字段重复。

答案 2 :(得分:0)

只要您的模式不是可变长度,您就可以使用fscanf。如果你需要更复杂的东西,可以尝试PCRE,但对于这种情况,我认为sscanf就足够了。

答案 3 :(得分:0)

我不建议直接在输入数据上使用fscanf,因为它对in数据非常敏感,如果一个字节错误并且突然没有格式说明符,那么在最坏的情况下你可以覆盖内存。

最好是使用fgetc和parse进入或读入缓冲区(fread)并从那里处理它。