Как отделить двоичные строки от текстового файла и сохранить их в массиве 1d или 2d char? - PullRequest
0 голосов
/ 01 марта 2019

"01110011 01100001 01100100" Это будет одна строка с 8 битами, разделенными пробелами в файле.

В настоящее время у меня есть:

if (fr != NULL) //see if file opens or not
{
    char chter[500]; //char to get string from text
    char *ptr; //pointer to char

    //char store[100][32];

    fgets(chter, 1000, fr); //gets text from file   

    printf("%s", chter); //prints current text to cmd from textfile
    puts("\n");

    for (int i = 0; i < 1; i++)
    {           
        li1 = strtol(chter, &ptr, 2); //convert 1st binary set to alphabet
        printf("%c", li1); //Not sure how to get the rest of the sets from here on
    }
    puts("\n");

    fclose(fr);
}

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

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете использовать отдельные указатели для strtol (ptr, &endptr, 2), что позволит вам работать со всеми значениями, содержащимися в chter.Во-вторых, вы рискуете неопределенным поведением, потенциально читая 1000 символов, где chter будет содержать только 500.В-третьих, вам необходимо правильно проверить результаты преобразования strtol, проверив (1), были ли преобразованы цифры;и (2) произошло ли переполнение / отток путем проверки errno.

Собрав их вместе, вы можете сделать:

#include <errno.h>
...
if (fr != NULL) //see if file opens or not
{
    char chter[500];    //char to get string from text
    char *ptr = chter;  /* assign chter to the pointer */
    char *endptr;       /* separate end-pointer for strtol */

    fgets(chter, sizeof chter, fr); /* properly limit read size */

    printf("%s", chter); //prints current text to cmd from textfile
    puts("\n");

    errno = 0;                      /* set errno zero */
    while (*ptr && *ptr != '\n')    /* loop over all values */
    {           
        long li1 = strtol (ptr, &endptr, 2);    /* convert to long */
        if (ptr == endptr) {        /* validate digits converted */
            fputs ("error: no digits converted.\n", stderr);
            /* handle error */
            break;
        }
        else if (errno) {           /* validate no over/underflow */
            perror ("strtol-conversion_failed");
            /* handle error */
            break;
        }
        printf (" %ld", li1);       /* output value */
        ptr = endptr;               /* advance pointer */
    }
    // puts("\n");
    putchar ('\n');     /* use putchar for single-char output */

    fclose(fr);
}

( примечание: не скомпилировано, поэтому, если у вас возникли проблемы, напишите об этом)

0 голосов
/ 01 марта 2019

После каждого вызова strtol, ptr будет указывать на первый байт в строке, который не является частью проанализированного целого числа.Это будет вашей отправной точкой на следующей итерации.Поскольку fgets возвращает строку с новой строкой, цикл до тех пор, пока ptr не будет указывать либо на новую строку, либо на нулевой байт в конце строки.

char *ptr, *tmp;

tmp = chter;
do
{
    li1 = strtol(tmp, &ptr, 2);
    printf("%c", li1);
    tmp = ptr;
} while ((*ptr != '\n') && (*ptr != '\0'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...