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

时间:2013-05-10 08:18:45

标签: c shell

我正在开发一个简单的“类似tar”的归档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使用存档内容填充空文件。

1 个答案:

答案 0 :(得分:2)

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

但是,你说的一件事让我怀疑是个问题:

  

它的工作原理是将所有文件,目录和文件内容写入文本文件

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

去二进制。