0

ポインタ関連の質問。現在、 dataFileというファイルからバッファにデータを読み込むサンプルコードをいくつか見ていきます。読み取りは、次のようにループ内で行われます。

unsigned char* buffer = (unsigned char*)malloc(1024*768*);
fread(buffer,1,1024*768,dataFile);
redPointer = buffer;
bluePointer = buffer+1024;
greenPointer = buffer+768;

ここで、配列バッファーの内容全体をファイルに書き込んで、それらの個別のイメージだけを保存できるようにします(大きなファイルはありません)。しかし、私はこれをどのように行うのか完全にはわかりません。

ステートメントをcoutしようとしましたが、コンソールにガベージ文字が印刷され、PCからビープ音が鳴ります。それで私は私のプログラムを終了します。

これ以外の方法はありますか?

for (int i=0; i < (1024*768); i++) {
fprintf(myFile, "%6.4f , ", buffer[i]); 
}
4

1 に答える 1

1

バッファをとして宣言することによりchar*、任意のポインタの算術インデックスまたは配列インデックスを使用sizeof(char)してオフセットを計算します。charは1バイト(8ビット)です。

バッファ内のデータで何をしようとしているのかわかりません。ここにいくつかのアイデアがあります:

各バイトの値を10進数で出力し、ASCIIテキストとしてエンコードします。

for (int i=0; i < (1024*768); i++) {
    fprintf(myFile, "%d , ", buffer[i]);
}

各バイトの値を16進数で出力し、ASCIIテキストでエンコードします。

for (int i=0; i < (1024*768); i++) {
    fprintf(myFile, "%x , ", buffer[i]);
}

ASCIIテキストでエンコードされた各浮動小数点数の値を10進数で出力します(配列インデックスの計算は、各浮動小数点の隣接する重複しないメモリ位置を処理するのに正しいと思います)

for (int i=0; i < (1024*768); i += sizeof(float)) {
    fprintf(myFile, "%6.4f , ", buffer[i]);
}

バッファを3つのファイルに分割します。各ファイルは、バッファの重複しないセクションからのものです。

fwrite(redPointer, sizeof(char), 768, file1);
fwrite(greenPointer, sizeof(char), 1024-768, file2);
fwrite(bluePointer, sizeof(char), (1024*768)-1024, file3);

fwriteのリファレンス。countパラメータについては、質問でハードコーディングしたオフセットを単純にハードコーディングしたことに注意してください。また、特定のポインターを減算して、各領域のバイト数を計算することもできます。また、これら3つのファイルの内容は、元のデータの適切に独立したセクションである場合にのみ適切であることに注意してください。

多分これはあなたにいくつかのアイデアを与えます。

更新: フォーマット動作をコンパイルおよびテストするための完全なプログラムを作成しました。これにより、バッファから最初の20項目のみが出力されます。(を使用して)コンパイルしgcc -std=c99て実行します。/tmp/dataを使用してファイルを作成し、ghexランダムなデータを入力しました。

#include <stdlib.h>
#include <stdio.h>

int main()
    {
    FILE* dataFile = fopen("/tmp/data", "rb");
    if (dataFile == NULL)
        {
        printf("fopen() failed");
        return -2;
        }

    unsigned char* buffer = (unsigned char*)malloc(1024*768);
    if (buffer == NULL)
        {
        printf("malloc failed");
        return -1;
        }

    const int bytesRead = fread(buffer,1,1024*768,dataFile);
    printf("fread() read %d bytes\n", bytesRead);

    // release file handle
    fclose(dataFile); dataFile = NULL;

    printf("\nDecimal:\n");
    for (int i=0; i < (1024*768); i++) {
        printf("%hd , ", buffer[i]);
        if (i > 20) { break; }
    }
    printf("\n");

    printf("\nHexadecimal:\n");
    for (int i=0; i < (1024*768); i++) {
        printf("%#0hx , ", buffer[i]);
        if (i > 20) { break; }
    }
    printf("\n");

    printf("\nFloat:\n");
    for (int i=0; i < (1024*768); i += sizeof(float)) {
        printf("%6.4f , ", (float)buffer[i]);
        if (i > 20) { break; }
    }
    printf("\n");

    return 0;
    }
于 2012-08-01T02:32:36.200 に答える