2

我的目标是从二进制文件中读取超过一百个“序列”(非技术术语),每个序列都包含一个 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

}

不幸的是,这不起作用,我什至不知道要开始调试。任何建议将不胜感激。

4

3 回答 3

1
  • 确保使用sizeof(char*)not分配字符串数组sizeof(char)
  • 也许unsigned char用于长度,以避免符号混淆。
  • 为尾随再分配一个字符'\0'
  • 使用 . 添加尾随空字节ColumnName[ctr][ColumnNameLength[ctr]] = '\0'
  • 添加一些错误检查以防malloc返回NULL
  • 添加错误检查以防fread返回长度以外的内容。
  • 在未来的问题中,更具体地说明实际失败的原因。
于 2012-10-09T06:14:11.737 回答
1

我在您的代码中看到的第一个错误是使用 <= 而不是 < ,您需要ColumnNameLength遍历字符,因此从 index 0 到 index ColumnNameLength -1

对我来说很奇怪,您使用指向指针的指针而不是使用 char 数组来保存字符串。

于 2012-10-10T14:12:30.357 回答
0
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';

}
于 2012-10-09T06:53:15.457 回答