2

私の目的は、100 を超える「シーケンス」(非専門用語) をバイナリ ファイルから読み取ることです。各シーケンスは、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記号の混乱を避けるために、おそらく長さを使用します。
  • 末尾にもう1文字割り当て'\0'ます。
  • を使用して末尾のヌルバイトを追加しますColumnName[ctr][ColumnNameLength[ctr]] = '\0'
  • mallocreturninsの場合のエラーチェックを追加しますNULL
  • fread長さ以外のものが返される場合に備えて、エラーチェックを追加します。
  • 今後の質問では、実際に何が失敗するかについてより具体的に説明してください。
于 2012-10-09T06:14:11.737 に答える
1

あなたのコードで最初に目にするバグは、 < の代わりに <= を使用していることです。ColumnNameLengthつまり、インデックス 0 から index に移動する文字がありますColumnNameLength -1

文字列を保存するためにchar配列を使用する代わりに、ポインターへのポインターを使用しているのは奇妙です。

于 2012-10-10T14:12:30.357 に答える