2013-05-10 35 views
2

我正在開發一個簡單的「tar-like」歸檔C程序。它通過將所有文件,目錄和文件內容寫入文本文件來工作,並且可以以相同的方式提取它們(它創建空文件,然後用存檔內容填充它們)。類似1的命令;和2c1;殼

當我必須存檔文本文件或PDF時,它運行良好。

隨着音頻文件,如MP3,在提取結束時,我對殼這些行:

1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1; 
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1; 
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c;1;1;112;112; 
1;0x1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c;1;1;112;112;1;0x1;2c1;2c1;2c1; 
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1; 
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c 

我不知道爲什麼程序寫入這個外殼上,爲什麼它這樣才與音軌。通過執行它們,我注意到只有1;命令被執行,並且2c1;命令是未知的。

你能幫我找出原因嗎?

這是代碼我寫的提取部分:

void crea_file(FILE *f)            // crea i file estratti dall'archivio 
{ 
    int contatore = 0; 
    char x[4096]; 
    bool listTrovata = false; 
    while (fscanf(f, " %s", x) == 1) { 
     if(strcmp(x, "%LIST%")==0 && listTrovata==false) 
     { 
      listTrovata= true; 
      puts("trovato il primo \n"); 
      continue; 
     } 
     else if (strcmp(x, "%LIST%")==0 && listTrovata) 
     { 
      long position; 
      position = ftell(f); 
      printf("trovato il secondo \n"); 
      printf("LIST trovato alla posizione %ld", position); 
      fseek(f, 0, SEEK_END); 
      break; 
     } 
     else if (listTrovata) 
     { 
      contatore++; 
      char* file;       // stringa contenente il percorso da aprire (verrà creato in seguito) 
      file = collega(getcwd(NULL, 0), x); 
      creat(file, PERMS); 
      printf("sto cercando l'inizio e la fine di content, passando un contatore %d \n", contatore); 
      trovaInizioFine(contatore); 
      printf("ora scrivo il file trovato"); 
      scriviFile(file); 
      //inserisco funzione che parte da inizio e scrive carattere per carattere nel file destinazione. se la posizione di ftell è uguale a fine, allora esci. 
     } 
    } 
    printf("esco \n"); 
} 

void trovaInizioFine(int cont)          // trova il carattere di inizio e di fine del file nella sezione %CONTENT% 
{ 
    FILE* contenuto; 
    char * path; 
    char x[4096]; 
    int i =1; 
    path = collegaSlash(getcwd(NULL, 0), nome); 

    contenuto = fopen(path, "r"); 
    while (fscanf(contenuto, "%s", x) == 1) 
    { 
     if(strcmp(x, "%CONTENT%")==0 && i == ((cont*2)-1)) 
     { 
      inizio = ftell(contenuto); 
      puts("trovato il primo \n"); 
      //puts(x); 
      printf("CONTENT trovato alla posizione %d \n", inizio); 
      i++; 
     } 
     else if(strcmp(x, "%CONTENT%")==0 && i == ((cont*2))) 
     { 
      fine = ftell(contenuto); 
      daleggere = fine-9; 
      puts("trovato il primo \n"); 
      printf("CONTENT trovato alla posizione %d \n", fine); 
      break; 
      i++; 
     } 
     else if(strcmp(x, "%CONTENT%")==0) 
     { 
      i++;  
     } 


     printf("giro numero %d \n", i); 
    } 

    printf("esco da trova Inizio File \n"); 
    fclose(contenuto); 

} 

void scriviFile(const char * arrivo)        //scrive i file creati in precedenza 
{ 
    FILE * partenza; 
    FILE * target; 
    int c; 
    int spazio = 'a'; 
    int i = 0; 
    int pos; 
    char * path; 
    path = collegaSlash(getcwd(NULL, 0), nome); 
    partenza = fopen(path, "r"); 
    fseek(partenza, inizio, SEEK_SET); 
    target = fopen(arrivo, "w");           //apro il file 
    if (target) {                //se è aperto 
     while ((c = fgetc(partenza)) != EOF && ftell(partenza)<=fine-10) {         //e il carattere preso non eccede la fine del file 
      fputc(c, target); 
      fputc(c, stdout); 
      pos = ftell(partenza); 
      if(pos==fine) 
      { 
       break; 
      } 
                      //scrivo lo stesso carattere in out (file in uscita) 
     }                 // 

     fclose(target);              //chiudo il file 
     fclose(partenza); 
    } 
    else 
    { 
     printf("errore di scrittura del file \n"); 
    } 

} 

我的檔案有3個部分:LIST%%,%DIRS%和%含量%。

crea_file讀取%LIST%部分並在當前目錄中創建空文件。
TrovaInizioFine讀取%CONTENT%部分並保存2個索引:一個位於文件內容的開頭,另一個位於尾部。
scrivifile用歸檔內容填充空文件。

+0

沒有任何代碼,你意識到這很難幫助,對吧? – unwind 2013-05-10 08:19:48

回答

2

沒有任何代碼可以看,這是非常困難的。

不過,你說一兩件事使我懷疑的問題:

它可以通過寫入一個文本文件

你不能把任意的二進制數據的所有文件,目錄和文件內容作爲文本,在大多數情況下。 C庫可能會進行行尾轉換,這會破壞二進制數據。您必須使用二進制文件來處理任意數據,或者注意「保護」數據,以使其真正能夠作爲文本處理。

去二進制。

+0

奇怪的是,我提取的音軌在iTunes上播放良好。 – 2013-05-10 08:33:39

+0

我改變了我的程序:現在即使在二進制文件上也能正常工作。它正確提取照片,但這些行仍然存在.. – 2013-05-10 17:59:14