C - читать в файл в соответствии с форматом - PullRequest
2 голосов
/ 01 ноября 2011

Я пытаюсь прочитать файл в определенном формате файла в c.
файл содержит некоторые элементы данных. каждый элемент данных разделен флагом. файл должен выглядеть так:

file-header: "FIL0"
file-id: 0x1020304

flag : 0|1 : uint8_t
length : uint32_t
char[length] : int utf-8

so its: [File-Header] [FileID] [Flag | Length | Data ] [Flag | Length | Data] ...<br>
--> "FIL0" | 0xFFFFFF | 0 or 1 | Data as char[] | 0 or 1 | ... (next data item) ....

Моя проблема возникает при чтении в файл. Моя идея состоит в том, чтобы открыть файл и сканировать его, используя некоторую магию sscanf.

FILE *fp;
fp = fopen("data.dat". "r");
/* scan file for data components */

  while (fgets(buffer, sizeof buffer, fp) != NULL) /* read in file */
    {
      /* scan for sequence */
      if (sscanf(buffer, "%5s", fil0_header) == 1) /* if the "FIL0" header is found */
        {
          printf("FIL0-header found: %s\n", buffer);

          // proceed and scan for [FLAG] [LENGTH] [DATA]
          // sscanf() 
          if (sscanf(buffer, "%u", node) == 1) 
            {
               // doesnt seem to work 
            }

          // read in length of string and extract stringdata

      else
        {
          printf("FIL0-Header not found, found instead: %s\n", buffer);
          // do something
        }
    }

Моя проблема в том, что мне трудно работать с буфером и различными типами данных в файле.

Сравнение заголовка fil0 работает нормально, но:

  • как читать следующий шестнадцатеричный номер (sscanf с использованием% D)
  • как отсканировать флаг размером 1 байт
  • как извлечь длину 4 байта

Проблема в том, что проверка флага начинается в начале буфера. но указатель должен быть перемещен после того, как заголовок FIL0 найден.
Буду благодарен за любую помощь!

Пожалуйста, помогите мне найти подходящие sscanf () -тзывы:

и хочу прочитать его и получить отдельные части моего файла: На одном [File-Header] и многие {[FileID] [Flag | Длина | Данные]} {...} items

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

ну, вы можете просто прочитать файл на байт, используя

 line[0] = (char) fgetc(fp);
 line[1] = (char) fgetc(fp);

и т. Д. Или пропустить приведение для получения int-значения ... следует выполнить трюк, чтобы сделать простое справа налевопроверка файла (или строки - как вы говорите, разрывов строки нет) ...

1 голос
/ 01 ноября 2011

Вы, вероятно, могли бы использовать некоторые стандартные методы синтаксического анализа , например, иметь лексер и рекурсивный парсер.Вы должны определить свой входной синтаксис более подробно.Возможно, вы могли бы использовать генераторы синтаксического анализатора (но для вашего простого примера это может быть излишним), например, ANTLR ...

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

...