Моя цель — прочитать из двоичного файла более ста «последовательностей» (нетехнических терминов), каждая из которых состоит из char1 (длина следующей строки), string1, char2, string2. Ключевыми моментами здесь являются динамическое распределение памяти, указатели и циклы. Вот как я это сделал:
char *ColumnNameLength = (char *) malloc(Repetitions * sizeof(char));
char *DataTypeLength = (char *) malloc(Repetitions * sizeof(char));
char **ColumnName = (char **) malloc(Repetitions * sizeof(char));
char **DataType = (char **) malloc(Repetitions * sizeof(char));
for (int ctr = 0; ctr <= Repetitions ; ColumnNameLength[ctr] = DataTypeLength[ctr] = NULL, ctr++)
;
for (int ctr = 0; ctr <= Repetitions ; *(ColumnName+ctr) = DataType[ctr] = NULL, ctr++)
;
for (int ctr = 0; ctr <= FieldCount; ctr++)
{
fread((ColumnNameLength + ctr), sizeof(char), 1, pInfile);
*(ColumnName + ctr) = (char *) malloc(ColumnNameLength[ctr] * sizeof(char));
fread(ColumnName[ctr], sizeof(char), ColumnNameLength[ctr], pInfile);
//I should add '\0' at the end of each read string, but no idea how
fread((DataTypeLength + ctr), sizeof(char), 1, pInfile);
*(DataType + ctr) = (char *) malloc(DataTypeLength[ctr] * sizeof(char));
fread(&DataType[ctr], sizeof(char), DataTypeLength[ctr], pInfile);
//I should add '\0' at the end of each read string, but no idea how
}
К сожалению, это не работает, и я даже не знаю, где начать отладку. Любой совет будет высоко ценится.
sizeof(char*)
не sizeof(char)
,unsigned char
для длины, чтобы избежать путаницы знака.'\0'
,ColumnName[ctr][ColumnNameLength[ctr]] = '\0'
,malloc
returnins NULL
,fread
возвращает что-то отличное от длины.Первая ошибка, которую я вижу в вашем коде, использует <= вместо < , у тебя есть ColumnNameLength
символы для перехода от индекса 0 к индексу ColumnNameLength -1
,
Мне странно, что вы используете указатель на указатель, а не массив символов для сохранения строки.
char *ColumnNameLength = (char *) malloc(Repetitions * sizeof(char));
char *DataTypeLength = (char *) malloc(Repetitions * sizeof(char));
char **ColumnName = (char **) malloc(Repetitions * sizeof(char*));
char **DataType = (char **) malloc(Repetitions * sizeof(char*));
for (int ctr = 0; ctr <= Repetitions ; ColumnNameLength[ctr] = DataTypeLength[ctr] = NULL, ctr++)
;
for (int ctr = 0; ctr <= Repetitions ; ColumnName[ctr] = DataType[ctr] = NULL, ctr++)
;
for (int ctr = 0; ctr <= FieldCount; ctr++)
{
fread((ColumnNameLength + ctr), sizeof(char), 1, pInfile);
ColumnName[ctr] = (char *) malloc((ColumnNameLength[ctr]+1) * sizeof(char));
fread(ColumnName[ctr], sizeof(char), ColumnNameLength[ctr], pInfile);
//I should add '\0' at the end of each read string, but no idea how
ColumnName[ctr][ColumnNameLength[ctr]] = '\0';
fread((DataTypeLength + ctr), sizeof(char), 1, pInfile);
DataType[ctr] = (char *) malloc((DataTypeLength[ctr]+1) * sizeof(char));
fread(DataType[ctr], sizeof(char), DataTypeLength[ctr], pInfile);
//I should add '\0' at the end of each read string, but no idea how
DataType[ctr][DataTypeLength[ctr]] = '\0';
}