C / C ++ чтение двоичного файла с несколькими строками и символами

Моя цель — прочитать из двоичного файла более ста «последовательностей» (нетехнических терминов), каждая из которых состоит из 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

}

К сожалению, это не работает, и я даже не знаю, где начать отладку. Любой совет будет высоко ценится.

2

Решение

  • Убедитесь, что для выделения строковых массивов используется sizeof(char*) не sizeof(char),
  • Возможно использовать unsigned char для длины, чтобы избежать путаницы знака.
  • Выделите еще одного персонажа для трейлинга '\0',
  • Добавьте завершающий нулевой байт, используя ColumnName[ctr][ColumnNameLength[ctr]] = '\0',
  • Добавьте проверку ошибок в случае malloc returnins NULL,
  • Добавить проверку ошибок в случае fread возвращает что-то отличное от длины.
  • В будущих вопросах будьте более конкретны о том, что на самом деле не получается.
1

Другие решения

Первая ошибка, которую я вижу в вашем коде, использует <= вместо < , у тебя есть ColumnNameLength символы для перехода от индекса 0 к индексу ColumnNameLength -1,

Мне странно, что вы используете указатель на указатель, а не массив символов для сохранения строки.

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';

}
0
По вопросам рекламы [email protected]