1

以下のコードを使用して、あるバイナリ ファイルから別のバイナリ ファイルにコピーしましたが、最初のファイルには EOF インジケーター (0xFF) が含まれているため、コピー関数は実際には最初の EOF インジケーターまでファイルをコピーします。

例: 私のファイルが新しいファイルに{0x01, 0x02, 0x03, 0xFF, 0x01, 0x02, 0xFF, 0xFF}のみ{0x01, 0x02, 0x03}コピーされる場合。それを修正する方法を考えてください(または、そこに何かが欠けているかもしれません...)

コード:

int Util_Copy_File(char* source, char* dest)
{
    FILE *fs,*ft;  
    char ch;
    char infile[100];
    sprintf(infile, "%s", dest);
    fs = fopen(infile,"r");  
    if(fs==NULL)  
    {
        return -1;  
    }
    ft = fopen(dest,"w");  
    if(ft==NULL)  
    {  
    fclose(fs);  
    return STATUS_FAIL;
    }  

    while(1)  
    {  
    ch = getc(fs);  
    if(ch==EOF)  
    {  
        break;  
    }  
    else  
        putc(ch,ft);  
    } 
    fclose(fs);  
    fclose(ft);
    return 0;
}

ありがとう、ビンヤミン

4

2 に答える 2

14

fgetc は char ではなく int を返すため、EOF と EOF と同じ値を持つ char の違いがわかります。

変化する:

char ch;

int ch

そして (*nix を使用している場合は通常関係ありません)

fs = fopen(infile,"r");  

fs = fopen(infile,"rb");  
于 2010-10-05T17:19:52.760 に答える
1

0xFFありませんEOF。-1 はEOF. int問題は、の戻り値をgetcaに格納していてchar、これが -1 に折りたたまれていることです0xFF(実際には実装定義の動作ですが、それが一般的な実装で行われることです)。

の戻り値getcは、または(値が -1)intの範囲内の値を持つ です。また、バイナリ データの正しい型はではなくです。unsigned charEOFunsigned charchar

于 2010-10-05T17:22:46.240 に答える