【问题标题】:Ignoring characters in a file while parsing解析时忽略文件中的字符
【发布时间】:2010-04-19 15:05:43
【问题描述】:

我需要解析一个文本文件并处理数据。有效数据通常由带有 TS 后跟 10 个数字 (TS1040501134) 的时间戳或带有 alpabet 后跟 9 个数字 (A098098098) 的值表示......所以它就像TS1040501134A111111111B222222222...........TS1020304050A000000000........

但是,有些情况下,没有数据时会出现填充 0。所以,这样的情况可能是

00000000000000000000TS1040501134A111111111B2222222220000000000TS1020304050A000000000........`

现在我们可以看到我需要忽略这些零。我该怎么做?我正在使用 gnu C。

【问题讨论】:

    标签: c string parsing gcc


    【解决方案1】:

    我第一次尝试类似“C”的东西 大约 20 年......所以接下来的内容充其量只是伪代码!

    读入一行文字,然后……

    char timestamp[11]; timestamp[10] = '\0';    
    char number[10]; number[9] = '\0';    
    
    for (i = 0 ; i < strlen(text); ) {
      if isAlpha(text[i]) {
         if text[i] == 'T' & text[i+1] == 'S' {
            memcpy(timestamp, text[i+2], 10)
            /* do whatever you do with a timestamp */
            i += 12 /* Skip over timestamp */
         } else {
            memcpy(number, text[i+1], 9)
            /* do whatever you do with a number */
            i += 10 /* Skip over number */
         }
       } else {
         if text[i] != '0' {
            /* handle the error - should not get here */
         }
         i++  /* move to next character */
       } 
    

    如果行不必包含完整的字符串(例如,一行以 TS10405 和 下一行以01134) 开始,您将不得不编写额外的代码来管理正确刷新text 缓冲区。

    【讨论】:

    • @WhirlWind。你会建议使用...批评是受欢迎的,但至少是建设性的(指导性的)。
    • strnlen();始终使用字符串函数的长度限制变体。
    【解决方案2】:

    您应该能够将文件读入字符串,然后使用 strnstr() 找到其中的“TS”子字符串。 strnstr() 返回的字符串将是时间戳的开始。

    要查找下一个时间戳,请在您刚刚找到的字符串之后的指针处在同一缓冲区上启动 strnstr。如果处理多个字符串,您将不得不处理单个时间戳被拆分为多个字符串的情况。

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多