обнаружение символа в файле и разбиение массивов байтов в C - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть массив байтов, которые мне нужно прочитать из файла.Я должен обнаружить символ (в основном идентификатор, говорящий мне, что то, что следует, является новым набором данных).Поэтому всякий раз, когда я вижу этот символ, я должен скопировать его в новый массив.Моя идея заключалась в том, чтобы иметь 2D-массив и другой массив size_t, который соответствует размеру каждого из этих массивов.Тем не менее, я понимаю, что есть некоторая проблема, когда я определил размеры.Это хороший способ понять это?Почему тогда не отображается желаемое поведение?

Пролить немного света.

int ret = 1;
int i, j  = 0;
FILE *fp = NULL;
const char *filename = "arrOfBytes"
fp = fopen(filename, "rb");
if (fp == NULL)
    return -1;
fseek(fp, 0, SEEK_END); 
int size = ftell(fp); 
fseek(fp, 0, SEEK_SET); 
char *arr[size];
size_t *arrSz;
arrSz = (size_t *)malloc(size * sizeof(size_t));
int ch;
size_t len = 0;
printf("size = %lu\n", size);
for (i = 0; i < size; i++){
// 68 65 6c 6c 6f 63 68 65 6c 6c 63 68 65 78 ---> detect ascii c= 63 hex value
    arr[i] = realloc(NULL, sizeof(char)*size);//size is start size
    if(!arr[i]) return -1;
    //if(!str)return str;
    while(EOF!=(ch=fgetc(fp)) && (len != size)){
        if (ch != 'c'){
            arr[i][len++]=ch;
            //printf("arr [%d][%d]  = %02X\n ", i, len -1 , arr[i][len -1]); 
        }
        arrSz[i] = len;
        arr[i] = realloc(arr[i], sizeof(char)*(len));//size is start size
        printf("arrSz[%d] = %d\n", i, arrSz[i]);
        printf("len = %d\n", len);
        printf("arr[%d][arrSz[%d]]= %d\n", i,arrSz[i], arr[i][(*arrSz)[i]]);
    }
    arr[i][len++]='\0';

}
fclose(fp);

Обновление вот что у меня есть:

// 68 65 6c 6c 6f 63 68 65 6c 6c 63 68 65 78

//identify 63 (character 'c')

//array 0: 68 65 6c 6c 6f   (arrSize 0 = 5)
//array 1: 68 65 6c 6c      (arrSize 1 = 4)
//array 2: 68 65 78         (arrSize 2 = 3)

//arrayCount = 0+1+2 = 3


int ret = 1;
int i, j  = 0;
FILE *fp = NULL;
fp = fopen(filename, "rb");
if (fp == NULL)
    return -1;
fseek(fp, 0, SEEK_END); 
int size = ftell(fp); 
fseek(fp, 0, SEEK_SET); 
char **array;
size_t *arrSz;
array = (char **)malloc(sizeof(char*));
arrSz = (size_t *)malloc(size * sizeof(size_t));
int ch;
int arrayCount = 0;
size_t len = 0;
printf("size = %lu\n", size);
for (i = 0; i < size; i++){

    arrayCount++;
    array = realloc(array,(arrayCount * sizeof(char*)));
    array[i] = realloc(NULL, sizeof(char)*size);//size is start size
    if(!array[i]) return -1;

    while(EOF!=(ch=fgetc(fp)) && (len != size) && ((char)ch != 'c'))
    {

        array[i][len++]=(char)ch;

    }
    arrSz[i] = len;
    array[i] = realloc(array[i], sizeof(char)*(len));//size is start size
    if(len == 0 | array[i] == NULL)
        break;
    printf("arrSz[%d] = %d\n", i, arrSz[i]);
    printf("len = %d\n", len);
    len = 0; //reset len counter

}

fclose(fp);
printf("new size of array = %d\n", sizeof(array));

for(i = 0; i < size; i++)
{
    for(j = 0; j < arrSz[i]; j++){

        printf("array [%d][%d]  = %02X\n ", i, j , array[i][j]);
    }
}

Даже после повторноговыделяя массив, я вижу, что его размер равен 8 :( У меня есть 2 неизвестных: количество байтов данных в каждом массиве. Количество самих массивов. Вот почему я выбрал двумерный массив.

1 Ответ

0 голосов
/ 28 сентября 2018

Одна из основных проблем заключается в следующем:

size_t **arrSz;
*arrSz = (size_t *)malloc(size * sizeof(size_t));

Здесь вы разыменовываете указатель arrSz перед его инициализацией.Это приведет к неопределенному поведению .

Также не ясно, зачем нужен указатель-указатель, который может работать как зубчатый массив массивовsize_t значения.И вам не нужен массив массивов длин.

Позже вы также делаете

*arrSz[i] = len;

, что в сочетании с приведенным выше кодом неверно, так как вы пытаетесь инициализировать arrSz какуказатель на массив, а не массив указателей, что означает, что вы должны были сделать (*arrSz)[i] = len.Но поскольку arrSz по-прежнему не инициализирован, он все равно UB, независимо от того, что вы делаете.

Простое решение?Не используйте двойное косвенное указание (указатель на указатель):

size_t *arrSz = malloc(sizeof *arrSz * size);

Существует также много других проблем, например, вы не сбрасываете len после прочтения одной строки, то естьНа следующей итерации цикла for вы продолжите работу с предыдущим значением и получите неинициализированные данные в начале выделенной памяти.

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

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