2012-10-22 52 views
0

我正在写一个程序,它必须创建一个文件,将其映射到内存,然后写入二维数组。当我查看文件时遇到问题。它充满了不期望的价值。我猜,这个问题与铸造有关,但不能提出解决方案。所以,问题是,如何将双精度数组转换为char *?希望有人能给我一个线索来解决这个问题。是否有可能将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; 
} 
+1

请删除与您的问题无关的所有代码(即除转换之外的所有代码)。 – Kiril

+0

我认为你传递* tab *的副本而不是指向它的指针。因此,任何修改都保留在本地副本中,并在函数返回时被破坏。 – farmdve

+0

数组的名称正好是它的指针,所以将它传递给我在原始数组上操作的函数,而不是它的副本。 – mic4ael

回答

2

我觉得你的代码工作,该文件包含双号,但请记住,它的浮点格式的二进制格式,所以用文本编辑器将只显示它的一些垃圾。尝试一个十六进制编辑器,并检查双重格式。或尝试将其读回来。

您的方法的主要问题是它不是跨平台,具有不同endianness的计算机将无法正确读取它(这可能对您或可能不是问题)。

你想要的是serialization。最简单的版本将只打印文件中的数字(用一些用户定义的有限精度) - 例如与sprintf ..

+0

更不用说一个具有不同“双倍大小”的系统。 – netcoder

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); 
    } 
} 
+0

我忘记提及它只是使用从 mic4ael

+1

提供的功能,它甚至不使用函数。新的char是一个C++关键字。目前还不清楚您的标签是否代表C或C++。 – farmdve

+0

@ mic4ael ^^什么farmdve说... – Kiril

0

我建议你用简单的WriteFile函数替换文件映射。对于许多应用程序来说它可以更快。

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

将准确快速地序列化您的数据。

相关问题