2013-02-02 64 views
0

我想在C語言中構建ar unix命令的一個版本。我正在處理詳細輸出,並且我已經介紹了大部分內容。但是,當我讀取文件並將文件名稱置於格式字符串中時,一個祕密的新行會不斷彈出。printf在格式字符串中添加一個 n

void verbose(char *archive){ 
    printf("\nI'm in -v!\n"); 

    int mode; 
    size_t readNum; 
    time_t mtime; 
    struct tm * time_box; 
    long long arch_size, file_size; 
    long uID, gID; 
    char header[60], file_name[16]; 
    char* tokens; 
    FILE *fp = fopen(archive, "r"); 
    if (!fp) 
     fail('f'); 

    //get file size 
    fseek(fp, 0, SEEK_END); 
    arch_size = ftell(fp); 
    rewind(fp); 

    //move over ARMAG 
    if(fseek(fp, strlen(ARMAG), SEEK_SET) != 0) 
     fail ('z'); 

    //loop over files 
    while(ftell(fp) < arch_size -1){ 
     //reads header into 
     readNum = fread(header, 1, sizeof(header), fp); 
     if(readNum != sizeof(header)) 
      fail('r'); 

     tokens = strtok(header, " "); 
     strcpy(file_name, tokens); 
     mtime = (time_t)(atol(tokens = strtok(NULL, " "))); 
     uID = atol(tokens = strtok(NULL, " ")); 
     gID = atol(tokens = strtok(NULL, " ")); 
     mode = atoi(tokens = strtok(NULL, " ")); 
     file_size = atoll(&header[48]); 
     time_box = localtime(&mtime); 

     printf("%d" 
       "\t%ld" 
       "/%ld" 
       "\t\t%lld " 
       "%s " 
       "%s\n", mode, uID, gID, file_size, &asctime(time_box)[4], file_name); 

     //move over file 
     if(fseek(fp, file_size, SEEK_CUR) != 0) 
      fail ('z'); 
    } 
    fclose(fp); 
} 

void delete(){ 
    printf("\nI'm in -d!\n"); 
} 

這段代碼產生這樣的輸出繼電器:

I'm in -v! 
100644 502/20  28 Jan 27 16:23:59 2013 
b.txt 
100644 502/20  17 Jan 27 16:24:06 2013 
c.txt 
100644 502/20  28 Jan 27 16:24:15 2013 
d.txt 
100644 502/20  17 Jan 27 16:24:06 2013 
c.txt 

我想不通爲什麼文件名是在新的一行。這太痛苦了。我認爲也許我沒有找到正確的方法,但是如果我按1字節尋找,就會開始切斷名稱,所以我不這麼認爲。

而且,獎金,如果任何人的方式知道到八進制轉換爲UNIX文件權限容易我會火上澆油(即-rw-RW-RW)

+0

這將是偉大的,我在Eclipse和控制檯面積比輸出大得多。另外,我已經測試過它的文件名,它會添加一個\ n,即使你只是printf「%s」,file_name; – hobbes131

回答

4

因爲asctime生成具有\n C字符串在NUL之前終止字符。檢查參考here

該字符串後跟一個換行符('\ n')和終止空字符。

+0

太過真實了,我用strncpy去掉它。感謝您指出了這一點! – hobbes131