парсинг файла при чтении в c - PullRequest
0 голосов
/ 19 апреля 2020

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

У меня есть текст файл в следующем формате:

in = 00000000000, out = 0000000000000000
in = 00000000001, out = 0000000000001111
in = 00000000010, out = 0000000000110011
......

Я пытаюсь использовать fscanf, чтобы использовать ненужные символы "in =", "," и "out =" и сохранять только символы, представляющие двоичные значения.

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

Мне удалось заставить fscanf использовать символы "in" и "out", но я не смог понять, как заставить его использовать символы "," "=". Кроме того, я подумал, что fscanf должен использовать пустое пространство, но, похоже, он этого тоже не делает.

Кажется, я не могу найти исчерпывающего списка доступных директив для сканеров, кроме generi c "% d,% s,% c ....." и мне кажется, что мне нужна более сложная комбинация директив для фильтрации символов, которые я пытаюсь игнорировать, чем я знаю, как форматировать.

Я мог бы помочь с выяснением этого. Я был бы признателен за любые рекомендации, которые вы могли бы дать, чтобы помочь мне понять, как правильно отфильтровывать "in =" и ", out =" и как хранить два столбца двоичных символов в двух отдельных переменных.

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

int main()
{
    FILE * f = fopen("hamming_demo.txt","r");
    char buffer[100];
    rewind(f);
    while((fscanf(f, "%s", buffer)) != EOF) {
        fscanf(f,"%[^a-z]""[^,]", buffer);
        printf("%s\n", buffer);
    }
    printf("\n");
    return 0;
}

Выводы из моего кода выглядят следующим образом:

 = 00000000000, 
 = 0000000000000000

 = 00000000001, 
 = 0000000000001111

 = 00000000010, 
 = 0000000000110011

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Функция семейства scanf называется паролем бедняга , потому что она не очень терпима к ошибкам ввода. Но если вы уверены в формате входных данных, он допускает простой код. Единственный маги c здесь, если этот пробел в строке формата будет собирать все пустые символы, включая новые строки или ни одного. Ваш код может стать:

int main()
{
    FILE * f = fopen("hamming_demo.txt", "r");
    if (NULL == f) {                               // always test open
        perror("Unable to open input file");
        return 1;
    }
    char in[50], out[50];                          // directly get in and out
    // BEWARE: xscanf returns the number of converted elements and never EOF
    while (fscanf(f, " in = %[01], out = %[01]", in, out) == 2) {
        printf("%s - %s\n", in, out);
    }
    printf("\n");
    return 0;
}
0 голосов
/ 19 апреля 2020

Так в принципе вы хотите фильтровать '0' и '1'? В этом случае fgets и простого l oop будет достаточно: просто посчитайте число 0 и 1 и завершите строку в конце нулем:

#include <stdio.h>

int main(void)
{
    char str[50];
    char *ptr;

    // Replace stdin with your file
    while ((ptr = fgets(str, sizeof str, stdin)))
    {
        int count = 0;

        while (*ptr != '\0')
        {
            if ((*ptr >= '0') && (*ptr <= '1'))
            {
                str[count++] = *ptr;
            }
            ptr++;
        }
        str[count] = '\0';
        puts(str);
    }
}
...