2010-04-19 83 views
2

我需要解析文本文件並處理數據。有效數據通常用TS後跟10個數字的時間戳(TS1040501134)或隨後的9個數字(A098098098)的值表示...所以它將類似於TS1040501134A111111111B222222222...........TS1020304050A000000000........解析時忽略文件中的字符

但是,沒有數據時會出現填充符0。所以,這種情況可能是

00000000000000000000TS1040501134A111111111B2222222220000000000TS1020304050A000000000........` 

現在,我們可以看到我需要忽略這些零。我怎麼能這樣做?我正在使用gnu C.

回答

0

我第一次嘗試'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緩衝區。

+0

永遠不要使用strlen()。 – WhirlWind 2010-04-19 22:05:47

+0

@WhirlWind。你會建議使用... Critisim是受歡迎的,但至少對它有建設性(指導性)。 – NealB 2010-04-20 01:53:21

+0

strnlen();總是使用字符串函數的長度限制變體。 – WhirlWind 2010-04-20 13:41:03

0

您應該能夠將該文件讀入字符串,然後使用strnstr()在其中找到「TS」子字符串。字符串strnstr()返回將是您的時間戳的開始。

要找到下一個時間戳,請在剛剛找到的字符串後面的指針上的同一緩衝區中啓動strnstr。如果處理多個字符串,則必須處理單個時間戳分散在多個字符串中的情況。