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