[英]Not reading data from file that should be there C++
因此,为了处理大于我计算机总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,没什么区别。而且是的,我需要能够写然后在以后读取文件。 请帮忙!
问题可能是这一行: 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)
请注意,以上内容并不完美,有时甚至很糟糕。 选择良好的ε可能很困难,甚至在某些应用中甚至是不可能的。 因此,在一些阅读材料中,您将找到有关如何进行比较的讨论,并链接到更多的数学运算资源: 每个程序员应了解的浮点运算法则还是为什么我的数字不累加?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.