Я работаю над проблемой создания собственной версии unix ar для C. Прямо сейчас я пытаюсь создать заголовок и записать его в файл.
Первоначально я использовал структуру stat и распечатывал содержимое с помощью fprintf. Однако, когда я пытаюсь использовать команду ar для файла, напечатанного таким методом, это не работает. Мне сказали, что лучшим решением будет использование fwrite для записи структуры непосредственно в файл. Поэтому я сейчас пытаюсь это реализовать.
Я пытался заполнить, а затем fwrite мою структуру ar_hdr информацией о статистике, однако, когда я пишу в файл, я получаю мусор.
Обновление 2: использование только fprintf на основе рекомендаций @fvu. Последний элемент в fprintf — это константа ARFMAG из ar.h, которая, я считаю, аналогична печати двух символов.
void header(char *archive, char *read_file){
struct stat sb;
FILE *fp;
if (stat(read_file, &sb) == -1)
fail('s');
fp = fopen(archive, "a");
if (!fp)
fail('f');
fprintf(fp, "%-16s%-12ld%-6ld%-6ld%-8d%-10lld%s", read_file, (long)sb.st_mtimespec.tv_sec,
(long)sb.st_uid, (long)sb.st_gid, sb.st_mode, (long long)sb.st_size, ARFMAG);
fclose(fp);
}
Тестовый вывод моей программы теперь выглядит примерно так:
!<arch>
b.txt 1359332639 502 20 33188 28 `
Appending B. shortb long b
d.txt 1359332655 502 20 33188 28 `
Appending D. shortb long b
c.txt 1359332646 502 20 33188 17 `
COpy this.
Когда я пробую команду unix: ar -tv myfile.a
результат: неподходящий тип или формат файла
Если я использую nano для просмотра test.a, это результат
!<arch>
^@b.txt 1359332639 502 20 100644 28 `
Appending B. shortb long b
d.txt 1359332655 502 20 100644 28 `
Appending D. shortb long b
c.txt 1359332646 502 20 100644 17 `
COpy this shit.
Перед первым заголовком стоит странный символ shift@. Вот мой код для записи общего заголовка файла, буду признателен за любые подсказки.
char title[] = ARMAG; //constant defined in ar.h
//open or create the output file
sf = open(argv[2], O_WRONLY | O_CREAT | O_APPEND, perms);
if (sf == -1)
fail('o'); //open fail
title_num = write(sf, title, sizeof(title));
Добавление результатов из файла od -x | голова -n 2:
0000000 3c21 7261 6863 0a3e 2e62 7874 2074 2020
0000020 2020 2020 2020 2020 3331 3935 3333 3632
struct ar_hdr bob;
. Для него уже выделено необходимое пространство, и он готов к использованию. - person fvu   schedule 02.02.2013%-8o
в строке формата, а не%-8d
, которое выдает десятичное). остальное выглядит вполне разумно на первый взгляд. - person fvu   schedule 02.02.2013od -x yourfilename | head -n 2
(шестнадцатеричный дамп первых 32 символов вашего файла? - этот ложный символ, скорее всего, является 0, который находится в конце строки с завершающим нулем ARMAG.write(sf, title, strlen(title));
должен позаботиться об этом. - person fvu   schedule 02.02.2013/
в качестве последнего непустого символа, и я могу подтвердить, что именно это и создает ar. Может быть, просто позаботьтесь об этой последней маленькой проблеме, чтобы быть в безопасности. - person fvu   schedule 02.02.2013