2014-01-25 2 views
0

Я пытаюсь разобрать заголовки файла Linux ar. Я использую структуру ar_hdr из файла ar.h для хранения данных заголовка. Я начал с малого, просто разбирая архив с помощью одного простого текстового файла и назначая данные заголовка массивам struct char.Чтение текстового файла переменной переполнения переменной?

void conciseTable(char *path) 
{ 

    int fd, r, pos; 
    struct ar_hdr header[20]; 

    //Open the file 
    fd = open(path, O_RDONLY); 
    if (fd == -1){ 
     perror("Error opening file"); 
     exit(-1); 
    } 

    // seek to end of ARMAG 
    pos = lseek(fd, SARMAG, SEEK_SET); 

    r = read(fd, header[1].ar_name, 16); 
    r = read(fd, header[1].ar_date, 12); 
    r = read(fd, header[1].ar_uid, 6); 
    r = read(fd, header[1].ar_gid, 6); 
    r = read(fd, header[1].ar_mode, 8); 
    r = read(fd, header[1].ar_size, 10); 

    printf("%s\n", header[1].ar_name); 
    printf("%s\n", header[1].ar_date); 
    printf("%s\n", header[1].ar_uid); 
    printf("%s\n", header[1].ar_gid);  
    printf("%s\n", header[1].ar_mode); 
    printf("%s\n", header[1].ar_size); 

    close(fd); 
} 

Файл ар выглядит следующим образом:

!<arch> 
1-s.txt/  1390594295 50389 13361 100640 41  ` 
1111111111111111111111111111111111111111 

Когда я бегу, я получаю следующий результат:

1-s.txt/  1390594295 50389 13361 100640 41 
1390594295 50389 13361 100640 41 
50389 13361 100640 41 
13361 100640 41 
100640 41 
41 

Похоже, что массивы Переполненная друг в друга и Я не могу понять, как остановить это.

Это link на странице руководителя ar.h, если это помогает.

ответ

0

Просто прочитайте данные и проанализируйте их. Вам нужно проверить и снова проверить. Я мог бы быть любой даже этой страницей html. Когда вы уверены, что поместили его в структуру

3

Вам необходимо назначить символ окончания 0 перед печатью строк с помощью printf("%s\n", ...) или вам нужно указать максимальную длину печати явно. То есть

printf("%16.16s\n", header[1].ar_name); 
printf("%12.12s\n", header[1].ar_date); 
printf("%6.6s\n", header[1].ar_uid); 
... 

То, что произошло в вашем случае является то, что первый Printf напечатано название и потому, что не было 0 прекращения голец, он продолжает печатать дату, идентификатор пользователя и т.д., то второй PRINTF печататься дата и продолжает печать UID, ...

+0

Спасибо, Мариан. Я добавил '/ 0' к последнему элементу каждого из них, и это сделало трюк. – Tanner

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