두 개의 .txt 파일이 있습니다. t1.txt에는 좌표가있는 두 개의 열이 있습니다. t2.txt에는 세 개의 열 (좌표 및 값)이 있습니다. t1.txt의 좌표에 대해 t2.txt에서 세 번째 열을 추출하고 싶습니다. 지금 내 코드는 두 .txt 파일에서 동일한 번호를 찾고 있습니다. 불행하게도, 좌표는 같지 않고 가장 가까운 좌표를 찾아야합니다. 내 코드를 변경하는 방법? 나는 약간의 정보를 찾으려고했지만, 나는 초보자이며 아무것도 도와주지 못합니다.C++에서 두 파일의 가장 가까운 숫자를 비교하고 추출하는 방법
내 코드 : 등호 복식 비교에 의존하지 마십시오
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
double** alokujPamiec(int,int);
void deleteAlokujPamiec(double**&);
int main()
{
int liczba=0;
fstream plik1("t1.txt",ios::out | ios::in); // 2 columns
fstream plik2("t2.txt", ios::out | ios::in); //3 columns
ofstream plik5("wynik.txt");
plik5 << setprecision(5) << fixed; // precision
int p1=0,p2=0;
char buff[255];
if(plik1.is_open()){
while(plik1.getline(buff,255)){
p1++; // number of lines
}
}else cout <<"Error in opening file 1"<<endl;
if(plik2.is_open()){
while(plik2.getline(buff,255)){
p2++;
}
}else cout <<"Error in opening file 2"<<endl;
cout << "lines in t1.txt" << "\t" <<p1<<endl;
cout << "lines in t2.txt" << "\t" <<p2<<endl;
plik1.close();
plik2.close();
fstream plik3("t1.txt",ios::out | ios::in);
fstream plik4("t2.txt", ios::out | ios::in);
double** dane1 = alokujPamiec(p1, 2);
double** dane2 = alokujPamiec(p2, 3);
int h=1;
cout <<"Loading data...."<<endl;
if(plik4.is_open()){
for(int i=0;i<p2;i++)
{
for(int j=0;j<3;j++){
plik4>>dane2[i][j];
}
}
}else cout << "Error 4"<<endl;
if(plik3.is_open()){
for(int i=0;i<p1;i++)
{
for(int j=0;j<2;j++){
plik3>>dane1[i][j];
}
}
}else cout << "Error 3"<<endl;
cout <<"Comparison and writing... "<<endl;
for(int i=0;i<p1;i++)
{
for(int j=0;j<p2;j++)
{
if(dane1[i][0]==dane2[j][0] && dane1[i][1]==dane2[j][1])
{
plik5<<dane1[i][0]<<"\t"<<dane1[j][1]<<"\t"<<dane2[j][0]<<"\t"<<dane2[i][1]<<"\t"<<dane2[i][2]<<endl;
liczba++;
}
}
}
cout <<"Number of found objects"<<"\t"<<liczba<<endl;
plik3.close();
plik4.close();
plik5.close();
deleteAlokujPamiec(dane1);
deleteAlokujPamiec(dane2);
getchar();
return 0;
}
double ** alokujPamiec(int iloscWierszy, int iloscKolumn)
{
double** tab2d = new double*[iloscWierszy];
double* dumm = new double[iloscWierszy*iloscKolumn];
for (int i = 0; i < iloscWierszy; i++)
tab2d[i] = dumm + i*iloscKolumn;
return tab2d;
}
void deleteAlokujPamiec(double**& tab2d) {
delete [] tab2d[0];
delete [] tab2d;
tab2d = 0;
}
피타고라스 정리는 좌표가 매우 가깝기 때문에 평평한 서피스가 구에 대한 근사가 될 정도로만 유효하므로주의해야합니다. 또한, 좌표가 실제로 작은 오차로 동일하다고 가정하기 때문에 합당한 엡실론과 각 값을 비교하면 충분합니다. –
이것은 기본적으로 내가했을 것입니다. 필요한 출력에 따라 필자는 임계 값 (ε)을 사용하여't1.txt'의 '엡실론'거리 내에 있거나 (@Sam으로) 지적한 't2.txt'의 모든 좌표를 찾고, 가장 가까운 지점을 추적하고 그 중 가장 가까운 지점을 걷어차십시오. –
자, 제안 해 주셔서 감사합니다! 오류는 작기 때문에 두 가지 방법을 모두 사용하려고합니다. – raquela