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

时间:2016-01-28 16:47:45

标签: c++ file

所以,为了处理比我的计算机的总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,没有区别...... 是的,我需要能够写,然后再读取该文件。 请帮忙!

1 个答案:

答案 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?