чтение файла неизвестного формата в C - PullRequest
0 голосов
/ 16 февраля 2019

Мне нужна помощь с этим упражнением в C language.

Я хотел бы знать, как мне прочитать данные из файла, который я не знаю, его формат.

-Файл будет содержать int (1-999) и char: "OL "= перегружен," ND "= noData," LB "= lowBattery.

Пример:

My_file.txt

Можно сделать так:

25
764
OL
ND
34
LB
624
235
ND
........

Или вот так:

534 ND 356 LB LB 234 765 123 ND ND......
235 976 LB 156 ND......

Я знаю, что это:

   FILE *f;
    char str1;
    f=fopen(filename,"r");
    str1=fgetc(f); 
    while(str1 != EOF)
    {
        printf("%c",str1);
        str1=fgetc(f);
    }
   fclose(f);

может читать файл до EOF.Но я не могу использовать его, потому что мне нужно присвоить эти значения некоторым int или chars ... (что, если я использую enum?)

Я уверен, что не могу использовать fscanf,Но реальный вопрос заключается в следующем: как мне прочитать файл и как назначить эти значения для struct или чего-то еще ... Итак, я могу использовать их для операций (например, сумма и другие).

Большое спасибо, ребята ...

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Я спросил друга.Он сказал, что я могу использовать fscanf.

Мне нужно только определить struct с символами.

С fscanf я прочитаю %s и добавлю их в char char_name[20];

Если я хочу, я могу использовать atoi/atof для чисел или strcmp для символов.

Если кто-нибудь знает другое простое решение.Пожалуйста, ответьте :) Вскоре я выложу код, работающий над ним:)

0 голосов
/ 17 февраля 2019

Я не знаю, что это за формат

Хмм .. мне кажется, вы точно знаете формат:

Файл будет содержать int(1-999) и char: "OL" = перегружен, "ND" = noData, "LB" = lowBattery

Ваш файл содержит разделенную пробелами последовательность токенов, каждый из которых является либо OL, ND, LB или целое число в указанном диапазоне.

Таким образом, для анализа этого файла читайте по одному символу за раз.Пробелы?Игнорировать и продолжить со следующим.Цифра?Теперь должно появиться еще 2 цифры.Прочитайте их и преобразуйте в целое число.'O', 'N' или 'L'?Ищите следующий символ, чтобы быть правильным.Все остальное?Ошибка разбора!

Чтобы сохранить каждый токен, создайте структуру, подобную:

struct Token
{
  enum
  {   TokenOverLoad
    , TokenNoData
    , TokenLowBattery
    , TokenData
  } kind;
  short data; // only if kind == TokenData
};

Затем сохраните их в виде списка или динамического массива во время синтаксического анализа.После этого вы можете перебирать этот список / массив для реализации любых необходимых функций, таких как sum ...

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