如何从文本文件中分离二进制字符串并将其存储在1d或2d char数组中?

时间:2019-03-01 02:21:11

标签: c arrays string file

“ 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 :(得分:0)

每次调用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'));

答案 1 :(得分:0)

您遇到的主要问题是无法为strtol (ptr, &endptr, 2)使用单独的指针,这将使您无法使用chter中保存的所有值。其次,通过潜在地读取1000个字符(其中chter仅保留500),您将面临不确定行为的风险。第三,您需要通过检查(1)数字是否转换来正确地 验证 strtol转换的结果。 (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);
}

注释:未编译,如果有问题,请删除注释)