我正在開發一個簡單的「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
用歸檔內容填充空文件。
沒有任何代碼,你意識到這很難幫助,對吧? – unwind 2013-05-10 08:19:48