6

C でアーカイブ プログラムを作成しています。提供したファイルを保存し、一覧表示して抽出します。
保存にテキスト ファイルを使用したため、多くの問題がありました。音楽や写真などのバイナリ ファイルを処理する場合、それらを抽出すると正しく実行されない (破損している) ため、最適な選択ではありません。この問題を解決するために、バイナリ アーカイブ ファイルを作成したいと考えました。

ファイル書き込み (抽出時) のコードは次のとおりです。

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, "rb");
    fseek(partenza, inizio, SEEK_SET);
    target = fopen(arrivo, "wb");                                           //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");
    }

}

バイナリファイルを正しく抽出する必要があるため、上記で書いたコードを使用できますか、またはすべてfgetc()fputc()関数をfread()andで変更する必要がありfwrite()ますか?

ありがとう

4

2 に答える 2

0

C でアーカイブ プログラムを作成しています。提供したファイルを保存し、一覧表示して抽出します。保存にテキスト ファイルを使用したため、多くの問題がありました。音楽や写真などのバイナリ ファイルを処理する場合、それらを抽出すると正しく実行されない (破損している) ため、最適な選択ではありません。この問題を解決するために、バイナリ アーカイブ ファイルを作成したいと考えました。

- をちょきちょきと切る -

バイナリ ファイルを正しく抽出する必要があるため、上記のコードを使用できますか、それともすべての fgetc() および fputc() 関数を fread() および fwrite() で変更する必要がありますか

バイナリ モードで作業する場合は、上で記述したコードを使用できます。fgetcfputcfreadおよび とは関係ありませんfwrite。テキスト モードで作業しているときにこの関数が特にうまく機能しない理由は、その場所に戻るftell以外に役立つことが保証されていないためです。したがって、テキスト モードで開いているファイルを操作する場合、コードは特に適していません。コードをリファクタリングすることで、結果として 4GB を超えるファイルを削除して操作することができますが、それがこのコードをリファクタリングする唯一の理由ではありません。fseekftell(partenza)<=fine-10ftell

于 2013-05-10T16:18:29.290 に答える