2017-10-02 13 views
2

私は最初のCプログラミングクラスで最初のプロジェクトに取り組んでおり、ポインタで迷っています。私たちはいろいろな方法でビットマップを変更する必要があります。私はファイルポインタを使用して、使用したいバイトデータを取得する方法を理解するのに苦労しています。私はビットマップファイルのヘッダーとDIBヘッダー構造とそれらを構成する値のバイトオフセットを知っています。しかし、後でファイルポインタを使用するためにこれらの値をそれぞれ保存する方法を理解するのが難しいです。これはプロジェクトのためのものですから、私はあまりにも多くの助けを求めたくありません。ここに私のこれまでのコードと私は、ヘッダの部分捕獲しようとしてきたさまざまな手段である:EOFfgetcを使用して遭遇するまでループはファイル全体を横断し、各文字を印刷する間、私はまた、簡単なテストビットマップヘッダのバイトを解析してファイルポインタで保存する

int main(int argc, const char * argv[]){ 
    FILE *fp; 
    char buff[2]; //only trying '2' to try and capture 'BM' at start of file. 
    fp = fopen(argv[1], "r+b"); 
    fseek(fp, 0, SEEK_END); 
    long fsize = ftell(fp); 
    rewind(fp); 

    // this is where I test what to do but can't get it correct 
    unsigned short filetype = fgetc(fp); 
    printf("First letter of filetype %c\n", filetype); //prints 'B' which is awesome 

    //Now I do not understand how to capture both the 'BM'. 
    //I've changed to use the fread as follows: 
    fread(buff, sizeof(char), 2, fp); 
    printf("Captured bytes with fread %s\n", buff) //this prints 4 char's and not 2? 

    fclose(fp); 
    return 0; 
} 

は、働いた。だから私はfgetcの各呼び出しで、ポインタの現在のバイト位置を現在の位置+ 1に変更すると仮定しています。

私は完全にファイルポインタを使用して多数のバイト単一のストアド変数に変換します。私もfseekfgetsを試してみました。

私はここでコミュニティから得ることができる助けと入力を感謝します。

+0

現在の理解を確認するには:Cの文字列とは何ですか? – immibis

+0

@immibis文字の配列 – Pwrcdr87

+0

'printf'のような関数はどのように終わりを知っていますか? – immibis

答えて

1

printf("%s", buff)は、buffとそれ以降の文字が指す文字をNUL文字に達するまで印刷します。残念なことに、buffBMしか含んでいませんでしたので、printfはNULが見つかるまで配列の最後を過ぎて読み取りを続けました。それは良くないね!

sizeof(char)1であることが保証されていることを

char buff[3]; 
size_t num_read = fread(buff, sizeof(char), 3, fp); 
buff[num_read] = 0; 

注意して

char buff[2]; 
fread(buff, sizeof(char), 2, fp); 

を交換してください。あなたはfreadBを読みたい場合は、もう一度それを巻き戻す必要がありますのでfgetcは、Bを超えてファイルポインタを進めていることを

注意。

+0

これは意味があります。私はあなたの例を本当に感謝します。それはそれをクリアするのに役立ちます。 – Pwrcdr87

+0

あなたの編集にコメントする:値を変更したいときに、ピクセルデータをトラバースするときに、ファイルポインタを継続的に進めて戻さなければならないことは分かっています。後で使用するためにヘッダーパラメーターを変数に保存する方法を把握しようとしています。あなたとイモビは本当に助けになりました。 – Pwrcdr87

+0

私はあなたがそのビットを理解すると確信していましたが、確かに確認してください:) – ikegami

関連する問題