0

forループを使用して、それぞれ16バイトを読み取る必要があります(16バイトの各ブロックを個別に暗号化する必要があるため)。どこが欠けているのかわかりません:(

私の完全なコード

typedef unsigned char BYTE;
FILE *fp;
BYTE buffer[16] = {0x00}; 
int i;
int lastBlock;
int main (int argc, char *argv[])
{
    int x;
    fp = fopen(argv[1], "r");
    fseek(fp, 0, SEEK_END);
    int fileSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    lastBlock = fileSize - 16;
    printf("FileSize %d \n", fileSize);
    printf("Lastblcok %d \n", lastBlock);
    for(x = 0;  x < lastBlock;  i+16){
        fread(buffer, 1, 16, fp);
        printf("%s\n", buffer);     
    }
    return(0);
}

私の間違いは何ですか?最後のブロック変数は問題ありません。ゴミを印刷します。ただのプレーンテキストファイルです。

4

3 に答える 3

4

内側の 2 つのパラメーターが逆になっています。16 バイトの 1 ブロックを読み取るのではなく、それぞれ 1 バイトの 16 ブロックを読み取ろうとしています。fread()また、読み取るように指示したすべてを実際に読み取ることを確認するためのエラーチェックも行っていません。

ループ制限変数についてlastBlockは、正しく計算されていません。たとえば、ファイルの長さが 100 バイトで、16 バイトのブロック全体で読み取りたい場合、6 ブロック ( 100/16) を読み取ります。あなたの計算 ( 100 - 16) は84 ブロックを読み取ろうとし、最初の 6 ブロックの後で惨めに失敗します。

このようなことをもっと試してください:

typedef unsigned char BYTE;

int main (int argc, char *argv[])
{
    int x, numRead;
    BYTE buffer[16];
    FILE *fp = fopen(argv[1], "rb");
    fseek(fp, 0, SEEK_END);
    int fileSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    printf("FileSize %d \n", fileSize);
    for(x = 0; x < fileSize; x += 16) {
        numRead = fread(buffer, 1, 16, fp);
        if (numRead < 1) {
            printf("error\n");
            break;
        }
        if (numRead < 16) {
            memset(&buffer[numRead], 0, 16-numRead);
        }
        printf("%.*s\n", numRead,buffer);
    }
    fclose(fp);
    return(0);
}
于 2013-10-24T02:19:00.563 に答える
1

このコードには 2 つの潜在的な問題があります。

1)失敗した読み取りのエラーステータスをチェックしていません

2)文字列を終了していません

提案:

char buffer[17];
...
for(x = 0;  x < lastBlock; x++){
    /* int fread(void *ptr, size_t size, size_t nitems, FILE *stream); */
    if ((err = fread(buffer, 16, 1, fp)) < 0) {
      perror ("Read error!\n");
    }
    else {
      buffer[16] = '\0';
      printf("%s\n", buffer);   
    }     
}
于 2013-10-24T02:19:20.587 に答える
0

「最後のブロック変数は問題ありません。ゴミを出力します。」

ゴミの理由:

関数はいくつかのfread要素を読み取るだけで、文字列をnull文字で終了しません

NULL ( '\0') ターミネータを自分で追加するか、代わりにfgets/を使用できます。fscanf

于 2013-10-24T02:18:52.893 に答える