2013-05-10 68 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