簡體   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