0

ファイルを作成し、それをメモリにマップしてから、double の 2 次元配列を書き込むプログラムを作成しています。ファイルを調べたときに問題が発生しました。期待しない値でいっぱいです。この問題はキャスティングに関連していると思いますが、解決策が思いつきません。それで、問題は、double の配列を char * に変換する方法です。誰かがこの問題を解決する手がかりを教えてくれることを願っています。

int main(int argc, char **argv)
{
    HANDLE plik, mappedFile;
    char  *poi;
    LPCWSTR fileName = L"plik.txt";
    double tab[8][12];
    createMatrix(tab); // here I fill the array with values

    // creating file
     // mapping the file

   poi = (char *)MapViewOfFile(
    mappedFile,
    FILE_MAP_ALL_ACCESS,
    0,
    0,
    0);

if (!poi)
{
    puts("Can't allocate Memory!");
    abort();
}

memcpy(poi,tab,96*sizeof(double));

UnmapViewOfFile((void*)poi);
CloseHandle(mappedFile);
CloseHandle(plik);
getchar();
return 0;
}
4

3 に答える 3

2

あなたのコードは機能していると思います。ファイルには二重の数値が含まれていますが、これは浮動小数点形式のバイナリ形式であるため、テキスト エディターではジャンクとして表示されることに注意してください。16 進エディタを試して、double 形式を確認してください。または読み返してみてください。

あなたのアプローチの主な問題は、それがクロスプラットフォームではないことです。エンディアンが異なるマシンはそれを正しく読み取ることができません(これは問題になる場合とそうでない場合があります)。

あなたが望むのはシリアライゼーションです。最も単純なバージョンは、ファイル内の数値を出力するだけです (ユーザー定義の限られた精度で) - たとえば、sprintf..

于 2012-10-22T20:43:05.337 に答える
0

あなたはこのようなものを探していますか:

char* poi = new char[8*12*sizeof(double)];
int index = 0;

for(int i = 0; i < 8; i++)
{
    for(int j = 0; j < 12; j++)
    {
        *(double*)(poi + index) = tab[i][j];
        index+=sizeof(double);
    }
}
于 2012-10-22T20:51:49.760 に答える
0

ファイル マッピングを単純な WriteFile 関数に置き換えることをお勧めします。多くのアプリケーションでより高速になる可能性があります。

WriteFile(plic, tab, sizeof(tab), 0, 0);

データを正確かつ迅速にシリアル化します。

于 2012-10-23T11:02:59.107 に答える