我正在编写一个程序,它必须创建一个文件,将其映射到内存,然后写入二维的双精度数组。当我查看文件时遇到问题。它充满了不期望的价值。我想,这个问题与铸造有关,但无法提出解决方案。那么,问题是,如何将双精度数组转换为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;
}
答案 0 :(得分:2)
我认为你的代码正在运行,该文件包含双数字,但请记住它是一种浮点格式的二进制格式,因此文本编辑器只会将其显示为一些垃圾。尝试十六进制编辑器,并检查双重格式。或者尝试阅读它。
您的方法存在的主要问题是它不是跨平台的,具有不同endianness的计算机无法正确读取它(这对您来说可能是也可能不是问题)。
你想要的是serialization。最简单的版本只是打印文件中的数字(具有一些用户定义的有限精度) - 例如与sprintf
..
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
我建议你用简单的WriteFile函数替换文件映射。它对许多应用来说可能更快。
WriteFile(plic, tab, sizeof(tab), 0, 0);
将准确,快速地序列化您的数据。