2012-11-17 1 views
1

Я пытаюсь запрограммировать функцию tar, но у меня есть некоторые проблемы. Я хочу прочитать данные tar tar и parse. вот моя структураПлохое значение при анализе заголовка 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 .... (как в первой строке). Как это сделать, чтобы исправить эту проблему?

Thanks

ответ

0

Это проблема с переполнением буфера. Вы должны увеличить размер nom, чтобы иметь возможность удерживать нулевой символ. Я не знаю, о функции дегтя, но пример,

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

Вы всегда должны объявить размер строки полукокса быть 1 больше максимальной ожидаемой длины, чтобы обеспечить нулевой символ.

+0

Спасибо, это работает. – guillaume

+0

Действительно? Стандарт - 100 для старого tar, и некоторые довольно разные вещи для нового ustar. – bmargulies

+0

Да, я тоже удивлен, потому что я выбрал 100 из-за спецификации tar:/ – guillaume

0

Вы можете ограничить длину строки Printf показывает 10, например

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

Для получения дополнительной информации о строках формата PRINTF см man 3 printf

 Смежные вопросы

  • Нет связанных вопросов^_^