2013-06-28 20 views
6

song.wavタイプのbinnaryファイルから4バイト目の最初のバイトを読みたい。 .wavファイルでは、最初の4バイトは52-46-49-49でなければなりません。ファイルからバイト単位で読み込む方法

私は、invalid conversion from "unsigned char" to "void"initialzing argument 1 of 'size_t fread(void*,size_t,size_t,FILE*)というフリーダイヤルの行にコンパイルアローラがあり、その意味が分かりません。

これは、バイトごとに読みたい場合、freadを実行する必要がある方法です。もし誰かがバイトごとにどのように読み込み、それを素晴らしいものにすることができるか考えている人がいるなら。ありがとうございました。

void checksong(char *argv[]){ 
    FILE *myfile; 
    int i; 
    unsigned char k[4]; 
    myfile=fopen(argv[2],"r"); 
    i=0; 
    for(i=0; i<4; i++){ 
     fread(k[i],1,1,myfile); 
    } 
    for(i=0; i<4; i++){ 
     printf("%c\n", k[i]); 
    }         
    return ; 
} 
+0

'getc()' charは常に1バイトです。 –

答えて

10

それは単一エラーである:

Invalid conversion from unsigned char to void* initializing argument 1 of

size_t fread(void*,size_t,size_t,FILE*) 

それはk[i]unsigned charはなく、ポインタであることを意味します。 &k[i]またはk+iを使用してください。

しかし、実際にはバイト単位で読む必要はありません。

fread(k, 4, 1, myfile); 

番号を印刷:あなたは4バイト、関与なしループ読むことができ、正確に1つのバイトを読み込み、インデックスikにそれを格納するために

for (i=0; i<4; i++) 
    printf("%d\n", k[i]); 
+0

私はそれをし、私のエラーを修正しました、ありがとうございます。しかし、番号52-46-49-49の代わりに私はいくつかの奇妙な記号を取得する必要があります:S –

+1

@ZoNiaCあなたは数字を取得します。単に%dではなく%cを使用して印刷してください。 – Elazar

5

を、あなたはアドレスを提供する必要があります要素のあなたはそういないforループ4.それらに興味があるなら、私

for(i=0; i<4; i++){ 
    fread(&k[i],1,1,myfile); 
} 

しかし、あなたはむしろ一度全体4つのバイトを読みましたすべてで、ちょうどん:

fread(k,1,4,myfile); 

失敗した場合にもfreadのリターンコード(とそのことについては、I/O操作)をテストすることをお勧めします。詳細についてはman freadをご覧ください。

4

あなたがうまくfread()でもfgetc()作品を使用しないように必要なだけの

char buffer[4]; 
fread(buffer,1,4,myfile); 
0

を使用することができます。簡単なコーディング。テキストファイルを読むのに十分です。

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    FILE* f = fopen("lak", "rb"); 
    fseek(f,0,SEEK_END); 
    long lsize=0,i=0; 
    lsize = ftell(f); 
    rewind(f); 

    while(i<lsize){ 
     int first = fgetc(f); 
     i++; 
     printf("first byte = %x\n", (unsigned)first); //you can do anything with 
                 //first now 
    } 

fclose(f); 

return 0; 
} 
関連する問題