У меня есть массив байтов, которые мне нужно прочитать из файла.Я должен обнаружить символ (в основном идентификатор, говорящий мне, что то, что следует, является новым набором данных).Поэтому всякий раз, когда я вижу этот символ, я должен скопировать его в новый массив.Моя идея заключалась в том, чтобы иметь 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 неизвестных: количество байтов данных в каждом массиве. Количество самих массивов. Вот почему я выбрал двумерный массив.