0

我正在编写一个程序,它必须创建一个文件,将其映射到内存,然后将二维数组写入它。我在查看文件时遇到问题。它充满了非预期值。我想,这个问题与铸造有关,但无法提出解决方案。所以,问题是,如何将双精度数组转换为 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

我认为您的代码正在运行,该文件包含双数字,但请记住,它是浮点格式的二进制格式,因此文本编辑器只会将其显示为一些垃圾。尝试使用十六进制编辑器,并检查双重格式。或者试着读回来。

您的方法的主要问题是它不是跨平台的,具有不同字节顺序的机器将无法正确读取它(这对您来说可能是也可能不是问题)。

你想要的是序列化。最简单的版本只打印文件中的数字(具有一些用户定义的有限精度) - 例如使用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 回答