1

たくさんのjpegを含む大きなファイルがあります。すべてのjpegを1つずつ抽出する必要があります。この問題に取り組むための私の最初のステップは次のとおりです。

1)「ブロック」変数を定義し、それに512バイトのストレージを割り当てます

2)すべてのjpegを含むファイルを開き、eofまでループします

3)最初のブロック(512バイト)を取得して、中身を確認します

現在、私のコードはコンパイルされません。これが私のエラーです:

 recover.c:27:19: error: implicitly declaring C library function
 'malloc' with type 'void *(unsigned int)' [-Werror]
     char* block = malloc(BYTE * 512);
                   ^ recover.c:27:19: note: please include the header <stdlib.h> or explicitly provide a declaration for 'malloc'
 recover.c:27:26: error: unexpected type name 'BYTE': expected
 expression
     char* block = malloc(BYTE * 512);
                          ^ recover.c:45:18: error: conversion specifies type 'int' but the argument has type 'char *'
 [-Werror,-Wformat]
         printf("%c", block);
                 ~^   ~~~~~
                 %s

これはこれまでの私のコードです:

#include <stdio.h>
#include <stdint.h>

typedef uint8_t BYTE;

//SOI - 0xFF 0xD8
//EOI - 0xFF 0xD9
//APPn - 0xFF 0xEn    
int main(void)
{
    //FAT - 512 bytes per block
    char* block = malloc(BYTE * 512);

    //open file containing pictures
    FILE* fh = fopen("card.raw", "rd");

    //make sure the file opened without errors
    if (fh == NULL)
    {
        printf("something went wrong and file could not be opened");
        return 1;
    }

    while (!feof(fh))
    {
        setbuf(fh, block);
        printf("%c", block);
    }

    fclose(fh);
return 0;
}

私は何が間違っているのですか?char * block = malloc(BYTE * 512);ではないのはなぜですか。512バイトを割り当てますが、代わりにエラーをスローしますか?また、この作品はまだコンパイルできないので、512バイトを正しく読み取っていますか?そうでない場合、どうすればこれを達成できますか?

ありがとう。

4

1 に答える 1

6

あなたはしたい:

#include <stdlib.h>

の定義を取得しますmalloc()

char* block = malloc(BYTE * 512);

する必要があります(mallocすでにバイトの観点から引数を取るため、sizeof(BYTE)返されます1):

char* block = malloc(512);

と:

printf("%c", block);

する必要があります:

printf("%s", block);

EJPがコメントで述べたように、これはエラーではありませんが、bufferwithを動的に割り当てる必要はありませんmalloc()。実行している作業に512バイトが必要になることはすでにわかっているので、その行を次のように置き換えることができます。

char block[512];

コンパイラとしてclangを使用していると思います。これは、エラーメッセージで非常に役立ちますが、基本的には修正方法を説明しています。

于 2013-03-18T22:55:13.690 に答える