2010-04-19 2 views
2

Мне нужно проанализировать текстовый файл и обработать данные. действительные данные обычно обозначаются либо меткой времени с TS, за которой следуют 10 номеров (TS1040501134), либо значениями с альпатетом, за которыми следуют девять чисел (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

+0

@WhirlWind. И вы бы предложили использовать ... Критис приветствуется, но, по крайней мере, должен быть конструктивным (поучительным). – NealB

+0

strnlen(); всегда используйте ограниченные по длине варианты строковых функций. – WhirlWind

0

Вы должны быть в состоянии прочитать файл в строке, а затем использовать strnstr(), чтобы найти подстроку «TS» в ней. Строка strnstr() возвращает начало вашей отметки времени.

Чтобы найти следующую временную метку, запустите strnstr в том же буфере указателем после строки, которую вы только что нашли. Если вы имеете дело с несколькими строками, вам придется иметь дело с ситуацией, когда одна временная метка разделяется на несколько строк.

Смежные вопросы