2013-07-19 4 views
0

숙제를 위해 나는 C 언어로 어쿠스틱 파일에 저장된 파일의 사용 권한과 파일 이름을 인쇄하는 코드를 작성했습니다. 내 코드가 컴파일되지만 어떤 이유로 두 번째 파일의 이름이 새 행에 반환됩니다.이 인쇄 출력 문제를 어떻게 해결할 수 있습니까?

rw-r--r-- 501/20 1-s.txt   
rw-r--r-- 501/20 2-s.txt 
(no empty blank line here) 

사람이 내 코드를 살펴보고 좀 줄 수 :

rw-r--r-- 501/20 1-s.txt   
rw-r--r-- 501/20 
2-s.txt  
(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; 
} 
+0

내가 올바른 제거 최근'의 printf ("\ n")를 생각하면, '나는 내 옆에있는 터미널 명령은 "2-s.txt"와 같은 줄에 표시 것을 제거하면 FCLOSE 문 –

+0

전 . – user2203774

답변

0

줄 바꿈을 원하지 않습니까? 그래서 그것을 인쇄하지 마십시오!

제거이 : 그것은 코드의 끝 부분에 위치

printf("\n"); 

.

편집

당신이 완전히 제거하지 않으려는 가우스, 그러나 당신이 마지막을 제외하고 언제든지 그것을 인쇄 할.

if (ftell(fp) != tot_file_size - 1) { 
    printf("\n"); 
} 

편집 V1.1

내 improvment 후 내 리눅스 민트 13 세 미만의 코드를 실행. 이것은 내 결과입니다 :

rw-r--r--a.txt/   
rw-r--r--b.txt/ 

이것은 원하는 형식일까요? 그렇습니다.

+0

라인을 제거한 후 다음 라인 1을 얻었습니다. rw-r -r-- 501/20 1-s.txt rw-r -r-- 501/20 line 2 : 2-s.txt – user2203774

+0

@ user2203774 제 편집을 확인 했습니까? –

+0

네, 제안을 받아 내 코드 끝에서 (즉, fclose (fp) 이전에) printf 문을 제거하고 while 루프 안에 printf 문을 추가했습니다 (올바른 경우 if 문과 동일합니다)). 그러나 두 번째 파일 이름은 여전히 ​​사용 권한 옆에있는 것이 아니라 다음 줄에 인쇄됩니다. 이 문제를 해결하는 방법에 대한 제안 사항이 있으십니까? – user2203774

0

여러 가지 문제가 있습니다.

  1. 영업 이익은 반복보다는 my_ar.ar_name의 파일 이름 "파일의 파일 이름"의 파일 상태를 조회에 호기심 if (stat(argv[1], &fileStat) == -1) ... 있습니다. 따라서 동일한 파일 통계가 나타납니다.

  2. 처음으로 printf("%.*s", 15, my_ar.ar_name)을 사용하면 "501/20 1-s.txt"가 나타납니다. 비정상적인 파일 이름처럼 보입니다. ar_name 필드는 "파일 이름이 맞으면 ar_name 필드에 이름이 직접 포함되고 오른쪽에 공백이 채워지고 슬래시 (/)로 끝나며 구성원 이름이 맞지 않으면 ar_name에 슬래시 /) 다음에 설명 된 아카이브 문자열 테이블에서 이름의 오프셋을 십진법으로 표시합니다. " 따라서 /이 있으면 파일 이름을 추출하는 데 더 많은 작업이 필요합니다. 또한 필드가 이 아니고 NUL 바이트가 종료 된 것일 수도 있습니다. 영업 시간은 struct ar_hdr입니다. 시도 :이 코드에 errantly 수행 http://www.lehman.cuny.edu/cgi-bin/man-cgi?ar.h+3

  3. 추출 된 파일 이름을, 또는 놀라운 바이트를 포함하거나 포함하지 않을 수있다. 이것이 출력의 두 번째 라인에서 예기치 않은 행간을 본 이유입니다. 파일 이름을 인쇄 가능한 ASCII char으로 테스트하는 것은 현명한 방법입니다.isprint()

관련 문제