gpt4 book ai didi

命令如 1;和 2c1;在 shell 上

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:39 25 4
gpt4 key购买 nike

我正在开发一个简单的“tar-like”归档 C 程序。它的工作原理是将所有文件、目录和文件内容写入一个文本文件,并且可以用相同的方式提取它们(它创建空文件,然后用存档内容填充它们)。

当我必须归档文本文件或 PDF 时,它运行良好。

对于 MP3 等音频文件,在提取结束时,我在 shell 上有这些行:

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

我不知道为什么程序在 shell 上写这个,为什么它只对音轨这样。通过执行它们,我注意到只有 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% 和 %CONTENT%。

crea_file 读取 %LIST% 部分并在当前目录中创建空文件。
TrovaInizioFine 读取 %CONTENT% 部分并保存 2 个索引:一个在文件内容的开头,一个在结尾。
scrivifile 用存档内容填充空文件。

最佳答案

没有任何代码可看,这很难。

不过,你说的一件事让我怀疑有问题:

It works by writing all files, directories and file contents in a text file

在大多数情况下,您不能将任意二进制数据视为文本。 C 库可能会进行行尾翻译,这会破坏二进制数据。对于任意数据,您必须使用二进制 文件,或者注意“保护”数据,以便它在被视为文本时真正幸存下来。

转二进制。

关于命令如 1;和 2c1;在 shell 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com