对于家庭作业,我用 C 语言编写了一些代码来打印出存储在 achive 文件中的文件的权限和文件名。我的代码可以编译,但由于某种原因,第二个文件的名称在新行中返回。
这是我的输出在终端中的样子:
rw-r--r-- 501/20 1-s.txt
rw-r--r-- 501/20
2-s.txt
(empty blank line here)
这就是我希望输出的样子:
rw-r--r-- 501/20 1-s.txt
rw-r--r-- 501/20 2-s.txt
(no empty blank line here)
有人可以看看我的代码并给我一些关于如何修复我的代码的提示吗?我怀疑这与我阅读和选择文件名(使用my_ar.ar_name
)的方式有关,但我不知道如何修复它。感谢您的时间。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/utsname.h>
#include <ctype.h>
#include <string.h>
#include <ar.h>
int main (int argc, char **argv)
{
FILE *fp;
size_t readNum;
long long tot_file_size, cur_file_size;
struct stat fileStat;
struct ar_hdr my_ar;
//open the archive file (e.g., hw.a)
fp = fopen(argv[1], "r");
if (fp == NULL)
{
perror("Error opening the file\n");
exit(-1);
}
//size of the archive file
fseek(fp, 0, SEEK_END);
tot_file_size =ftell(fp);
rewind(fp);
//read data into struct
fseek(fp, strlen(ARMAG), SEEK_SET);
file_size_cnt = 0;
while (ftell(fp) < tot_file_size - 1)
{
readNum = fread(&my_ar, sizeof(my_ar), 1, fp);
if (stat(argv[1], &fileStat) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
if ((fileStat.st_mode & S_IFMT) == S_IFREG)
{
printf( (fileStat.st_mode & S_IRUSR) ? "r" : "-");
printf( (fileStat.st_mode & S_IWUSR) ? "w" : "-");
printf( (fileStat.st_mode & S_IXUSR) ? "x" : "-");
printf( (fileStat.st_mode & S_IRGRP) ? "r" : "-");
printf( (fileStat.st_mode & S_IWGRP) ? "w" : "-");
printf( (fileStat.st_mode & S_IXGRP) ? "x" : "-");
printf( (fileStat.st_mode & S_IROTH) ? "r" : "-");
printf( (fileStat.st_mode & S_IWOTH) ? "w" : "-");
printf( (fileStat.st_mode & S_IXOTH) ? "x" : "-");
printf("%.*s", 15, my_ar.ar_name);
printf("\n");
}
cur_file_size = atoll(my_ar.ar_size);
if (fseek(fp, cur_file_size, SEEK_CUR) != 0)
{
perror("You have an error.\n");
exit(-1);
}
}
//printf("\n");
fclose(fp);
return 0;
}