所以,为了处理比我的计算机的总RAM内存更大的3D bool阵列,我尝试将它们翻译成文件形式 文件名是x坐标 在文件内部写入y坐标,z坐标和0或1表示bool值 (我没有把它全部放到一个文件中,因为它花了很长时间才能被阅读) 这是制作文件的代码
char fileName[100];
for(double px = minX; px <= maxX; px = px + deltaX)
{
sprintf(fileName,"%lf.txt",px);
allPoints = fopen(fileName,"w");
for(double py = minY; py <= maxY; py = py + deltaY)
{
for(double pz = minZ; pz <= maxZ; pz = pz + deltaZ)
{
if(test(x,y,z))
{
fprintf(allPoints,"%lf\t%lf\t1\n",py,pz);
}
else
{
fprintf(allPoints,"%lf\t%lf\t0\n",py,pz);
}
}
}
fclose(allPoints);
}
(deltaX deltaY和deltaZ非常小,因此有很多要点) 一切都运行良好,文件创建和一切 问题是当我尝试读取文件时,这里是我正在使用的代码
for(double kx = minX; kx <= maxX; kx = kx + deltaX)
{
for(double ky = minY; ky <= maxY; ky = ky + deltaY)
{
for(double kz = minZ; kz <= maxZ; kz = kz + deltaZ)
{
if(Check_if_True(kx,ky,kz))
{
//do something
}
}
}
}
bool Check_if_True(double kx, double ky, double kz)
{
char ignore;
char fileN[256];
double iy;
double iz;
int b;
sprintf(fileN,"%lf.txt",kx);
ifstream reader (fileN);
if(!reader.is_open())
{
printf("couldn't open file");
}
while(reader >> iy >> iz >> b)
{
if(iy == ky && iz == kz)
{
reader.close();
if(b == 1)
{
return true;
}
else
{
return false;
}
}
}
printf("didn't find the values\n");
reader.close();
return false;
}
我可以通过在屏幕上打印来确认它是否正确读取了值,但是它总是打印出“没有找到值”,好像它扫描了整个文件并且没有找到需要的价值 我已经被困在这三天了,我试过fstream和stdio,没有区别...... 是的,我需要能够写,然后再读取该文件。 请帮忙!
答案 0 :(得分:0)
问题可能就在这一行:if(iy == ky && iz == kz)
在这里,您要比较浮点数,它们是计算机中具有一定位数的二进制数字。它们不能完全代表相同的实数,因为您可以用十进制数精确表示(反之亦然)。此外,当您使用浮点数进行任何数学运算时,都会出现舍入错误。因此,您通常不希望将它们进行比较以获得完全相等,您只是想知道它们是否足够接近以被视为相同的值。
上面这样if
这样做:
#include <cmath>
const double EPSILON = 0.0000001; // choose appropriate value for your application
...
if(std::fabs(iy - ky) < EPSILON && std::fabs(iz - kz) < EPSILON)
请注意,上述情况并不完美,有时情况完全不好。选择好的epsilon可能很难,甚至在某些应用中也是不可能的。所以,在一些阅读中,您将找到关于如何进行比较的讨论,以及链接到更多数学资源:What Every Programmer Should Know About Floating-Point Arithmetic or Why don’t my numbers add up?