繁体   English   中英

不从应该存在的文件中读取数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM