Разбор файла в C - PullRequest
       38

Разбор файла в C

1 голос
/ 18 апреля 2010

Мне нужно разобрать файл и выполнить в нем некоторую обработку. Файл представляет собой текстовый файл, а данные представляют собой данные переменной длины в форме "PP1004181350D001002003 ..........". Таким образом, будут метки времени, если есть PP, поэтому 1004181350 - это 2010-04-18 13:50. Там, где есть D, это точки данных, которые представляют собой три отдельные данные, каждая из которых состоит из трех цифр, поэтому D001002003 имеет три координаты 001, 002 и 003.

Теперь мне нужно проанализировать эти данные из файла, для которого мне нужно хранить каждую временную метку в массиве и соответствующие данные в массивах, которые содержат столько строк, сколько данных и три строки для каждой координаты. Конечный массив может быть как

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 ]

2 голосов
/ 18 апреля 2010

edit: обновлено в соответствии с вашими требованиями.

Хотя ваш файл имеет переменную длину, а данные - нет, вы можете использовать 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, ...)
    }
}

Обратите внимание, что при этом данные считываются в целые числа (временная метка, low, medium и high - целые числа), строковая версия выглядит следующим образом (timestamp, low, medium и high - массивы символов):

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];
    }
}

edit: еще несколько пояснений о строке форматирования, с %*6d Я имею в виду: найдите 6 цифр и отбросьте их (* означает: не вводите переменную). %4d или %4c означает в этом контексте то же самое (поскольку 1 цифра будет одним символом), но мы сохраняем их в соответствующих переменных.

0 голосов
/ 20 апреля 2010

Я бы не рекомендовал использовать fscanf непосредственно для входных данных, потому что он очень чувствителен к входным данным, если один байт неверен и неожиданно не определяет спецификатор формата, тогда в худшем случае вы можете перезаписать память.

Лучше либо использовать fgetc и анализировать, когда он входит, либо читать в буфер (fread) и обрабатывать его оттуда.

0 голосов
/ 18 апреля 2010

Пока ваши шаблоны не переменной длины, вы можете просто использовать fscanf . Если вам нужно что-то более сложное, вы можете попробовать PCRE , но для этого случая, я думаю, достаточно sscanf.

0 голосов
/ 18 апреля 2010

просто разбор? Вот оно !!


ОБНОВЛЕНИЕ: Проверьте код KillianDS выше. Это даже лучше !!

  • [ШАГ 1] Поиск / n (или CR + LF)

  • [ШАГ 2] Начиная с первого символа в строке, U знает номер. символов каждое поле данных занимает. Прочитайте столько символов из файла.

Повторите для всех полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...