这是一个任务(不是我的,但是我正在帮助的人,如果这很重要),但是应该编写一个模仿unix ar命令的程序。我非常接近使用stat()函数将文件信息写入标题,但是在写入文件时我得到@ ^而不是空格。
这是一个输出
的例子 1-s.txt2 ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ Wed 10月30日149972 ^ @ 14601 ^ @ 100640 ^ @ ^ @ 101 ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @
and it should be
1-s.txt2/ Wed Oct 30 149972 14601 100640 101
除了日期应该是一个unix时间戳,任何帮助也将不胜感激。
感谢!!!
struct ar_hdr headerstruct;
void setfileinfo(const struct stat *sfileinfo){
sprintf(headerstruct.ar_name, "%s", global_argv[3]);
sprintf(headerstruct.ar_date, "%s", ctime(&sfileinfo->st_mtime));
sprintf(headerstruct.ar_uid, "%ld", (long)sfileinfo->st_uid);
sprintf(headerstruct.ar_gid, "%ld", (long) sfileinfo->st_gid);
sprintf(headerstruct.ar_mode, "%lo",(unsigned long)sfileinfo->st_mode);
sprintf(headerstruct.ar_size, "%lld",(long long)sfileinfo->st_size);
char filemag[2] = "`\n";
int fd;
fd = open(global_argv[2], O_RDWR);
lseek(fd, 0, SEEK_END);
write(fd, headerstruct.ar_name, 16);
write(fd, headerstruct.ar_date, 12);
write(fd, headerstruct.ar_uid, 6);
write(fd, headerstruct.ar_gid, 6);
write(fd, headerstruct.ar_mode, 8);
write(fd, headerstruct.ar_size, 10);
write(fd, filemag ,2);
return;
}
答案 0 :(得分:2)
你正在写一堆垃圾,因为无论字符串有多长,你都要写16个(或其他)字符。
尝试更改为:
write(fd, headerstruct.ar_name, strlen(headerstruct.ar_name));
等等。如果是一个固定长度的字段,则从长度中减去1,如果你想将它作为分隔符,则故意write()
一个空格字符。
答案 1 :(得分:2)
由于ar
标头需要空格填充,因此您可以考虑使用memset
使用空格预填充数据结构或特定成员。例如:
memset(&headerstruct, ' ', sizeof(headerstruct));
此外,如果您想避免标题中以空字符结尾的字符串,则应使用memcpy
或strncpy
(具有适当的长度)而不是sprintf
,{ {1}}将在字符串的末尾插入一个零字节。
答案 2 :(得分:1)
你没有得到@^
,而是^@
,这是一个空字节。也就是说,来自全局变量headerstruct的内存初始化为零。
我只会使用fprintf(3)
代替sprintf(3)
。结构中的中间存储不会给您带来额外的好处。
答案 3 :(得分:1)
如果您希望这些字符数组中未使用的字符为空白,则需要将空白放在那里。
一种方式就像
size_t ansize;
ansize = sizeof(headerstruct.ar_name);
snprintf(headerstruct.ar_name, ansize, "%-*.*s", (int)ansize, (int)ansize, global_argv[3]);