1

tar 関数をプログラムしようとしていますが、問題があります。tar ファイルを読み取り、ヘッダー データを解析したいと考えています。ここに私の構造があります

struct header { 
    char nom[100];
    char droits[3];
    char taille[12];
    char date_modif[12];
    char type[1];
};

そして今、ヘッダーデータを解析する私のコード:

while ( fread(head.nom, 100, 1, archive) != 0 ){

    printf("NOM : %s\n", head.nom);


    //droits
    fread(head.droits, 3, 1, archive);


    printf("DROITS : %s\n", head.droits);

    //taille
    fread(head.taille, 12, 1, archive);

    printf("TAILLE : %s\n", head.taille);


    //last modif
    fread(head.date_modif, 12, 1, archive);

    printf("MODIF : %s\n", head.date_modif);


    //type
    fread(head.type, 1, 1, archive);

    printf("TYPE : %s\n", head.type);

    printf("NOM : %s\n", head.nom);

    exit(1);
    // on se place a la fin du premier fichier
    fseek(archive, oct2dec(atoi(head.taille)), SEEK_CUR);


    //fprintf(stdout, "%s %d \n", head.nom, oct2dec(atoi(head.taille)));        

    i++;
}

結果は次のとおりです。

NOM : a.txt...............................................................................................
DROITS : 664
TAILLE : 936.........
MODIF : 1352910882..
TYPE : 1
NOM : a.txt...............................................................................................664936.........1352910882..1

私の問題は、最後の行にすべてのデータが表示され、a.txt .... (最初の行のように) のみを表示したいことです。この問題を解決するにはどうすればよいですか?

ありがとう

4

2 に答える 2

0

これはバッファ オーバーフローの問題です。nomnull 文字を保持できるようにするには、 のサイズを大きくする必要があります。tar関数についてはわかりませんが、例として、

struct header { 
    char nom[200];
    char droits[10];
    char taille[20];
    char date_modif[20];
    char type[5];
};

char 文字列のサイズは、ヌル文字を許容するために、予想される最大長よりも 1 大きいサイズを常に宣言する必要があります。

于 2012-11-17T22:09:40.267 に答える
0

たとえば、printf が表示する文字列の長さを 10 に制限できます。

printf("NOM : %.10s\n", head.nom);

printf フォーマット文字列の詳細については、次を参照してください。man 3 printf

于 2012-11-17T22:10:02.093 に答える