Błąd przy wczytywaniu danych z pliku

0

Mam problem z wczytywaniem danych z pliku. Przy wczytywaniu danych z pliku w którym są podane współrzędne punktów X i Y wszystkie punkty wczytują się dobrze oprócz ostatniego X i ostatniego Y. Zamiast prawidłowych wartości program podstawia pod ostatnie zmienne zupełnie inne liczby. Proszę o pomoc, ponieważ siedzę już dłuższy czas nad tym i nic nie mogę wymyśleć. Żeby skompilowac program trzeba utworzyć plik wsp.txt w którym są współrzędne punktów x i y oddzielone tabulatorem(jeden punkt w jedej linii). Program oblicza współrzędne punktów zapisuje je na listę a następnie zapisuje je w pliku wsp2.txt. Przy okazji wyświetla na konsolę wyniki (Xwczytane \t Ywczytane \t x1 \t y1 \t x2 \t y2). Problem jest z ostatnim X wczytane i Ywczytane. Do wczytywania danych z pliku stworzyłem strukturę i pewnie tam jest gdzieś problem, czyli na początku funkcji main lub w którejkolwiek pętli for. Z góry dzięki za odpowiedź i sory za kiepskie uporządkowanie całego programu ;) (to dopiero prototyp ;P)

#include <iostream>
#include <fstream>
#include <conio.h>
#include <cmath>
using namespace std;


//strultura odczytująca punkty z pliku
struct Tpunkt {
int x;
int y;
};

//lista
struct element_listy   {
double dane1, dane2, dane3, dane4, dane5, dane6;
element_listy *wsk_nastepnika;    
};

//funkcja drukujaca liste rekurencyjnie  
void drukuj_liste_rek(element_listy *adres)   
{  
  // warunek zakończenia rekurencji   
  if (adres != NULL)   
  {   
    //zawartosc elementu   
    cout <<(*adres).dane1<<"\t"<<(*adres).dane2<<"\t"<<(*adres).dane3<<"\t"<<(*adres).dane4<<"\t"<<(*adres).dane5<<"\t"<<(*adres).dane6<<endl;   
    // nast element   
    adres=adres->wsk_nastepnika;   
    // rek   
    drukuj_liste_rek(adres);   
  };   
};

void zapis_list_it(element_listy *adres)   
{ 
     ofstream plik_wy;
     plik_wy. open ("wsp2.txt");  
     while (adres!=NULL)   
  {   
    // wypisujemy zawartość elementu    
    plik_wy <<(*adres).dane1<<"\t"<<(*adres).dane2<<"\t"<<(*adres).dane3<<"\t"<<(*adres).dane4<<"\t"<<(*adres).dane5<<"\t"<<(*adres).dane6<<endl;   
    // i przechodzimy do następnego   
    adres = adres->wsk_nastepnika;   
  } 
  plik_wy. close ();  
}   
int main() {
    

//czytanie punktow z pliku
int lp=0; 
Tpunkt punkty[lp], pkt; 
ifstream dane ("wsp.txt");
dane >> pkt.x >> pkt.y; // pierwsze czytanie
while (! dane. eof()) {
punkty [lp]=pkt;
lp++;
dane >> pkt.x >> pkt.y; // czytanie w petli
}
dane.close();



double a, b, a2, b2, xb, yb, c, d, e, xp, yp, r, delta, yo1, yo2, xo1, xo2, f, g, h, i, j, k, yo, xo, b3, l, m, o, x1, x2, y1, y2, x11, y11, x22, y22, delta2; 



//obliczanie parametrow prostej
cout<<"podaj wspolrzedne 1 punktu(x1_y1)"<<endl;
cin>>x11>>y11;
if(x11==y11){
            do{
            cout<<"podaj wspolrzedne 1 punktu(x1_y1)"<<endl;
            cin>>x22>>y22;//wspolrzedne punktow do prostej(l)
            }
            while((x11==x22)&&(y11==y22));
            }
            else{
            cout<<"podaj wspolrzedne 1 punktu(x2_y2)"<<endl;
            cin>>x22>>y22;//wspolrzedne punktow do prostej(l) 
                 }
                 
                 cout<<"Podaj promien"<<endl;
                 cin>>r;
                 
element_listy *glowa, *aktualny, *poprzedni, *tmp;
aktualny = NULL;   
poprzedni = NULL;   
glowa = poprzedni; 
if((x11!=x22)&&(y11!=y22)){

                                 
                                 a=(y11-y22)/(x11-x22);//obliczania prostej
                                 b=y22-a*x22;
                                 cout<<"Prosta utworzona z 2 punktow to: y="<<a<<"x+"<<b<<endl;
                                 
                                
                                //prosta prostopadla(k) przechodzac przez punkt wczytany z pliku (a)
                                
                                
                                
                                for (int z=0;z<lp+1;z++){
                                    
                                    //jezeli punkt lezy na prostej lub odleglosc jest wieksza niz 2r nie ma okregow
                                    if( (yp!=(a*xp+b))  &&  (abs(a*xp-yp+b)/ (sqrt(pow(a,2)+1))<2*r)  ){
                                  
                                    xp=punkty[z].x;//punkty z pliku
                                    yp=punkty[z].y;
                                    
                                    
                                    poprzedni = aktualny;   
                                    // tworzymy nowy element    
                                    aktualny = new element_listy;   
                                    // zapisujemy do niego odczytane dane   
                                    aktualny->dane1 = punkty[z].x; 
                                    aktualny->dane2 = punkty[z].y;   
                                 
                                    
                                
                                
                                   
                                    // tworzennie prostej k prostopadlej do wczytanej prostej przechodzacej przez pkt A 
                                    a2=-(1/a);
                                    b2=yp-a2*xp;
                                    
                                    
                                    //obliczanie wspolrzednych punktu przeciecia prostych k i l (b)
                                    xb=(b2-b)/(a-a2);
                                    yb=a*xb+b;
                                    
                                
                                
                                    
                                    //obliczanie wspolrzednych punktu o ( punkt oddalony o r od prostej l)(rownanie kwadratowe cyo^2+dyo+e)
                                    c=1+pow(a2,2);
                                    d=2*a2*b2-2*xb-2*a2*yb;
                                    e=pow(xb,2)+pow(yb,2)+pow(b2,2)-2*yb*b2-pow(r,2); 
                                    //obliczanie delty i pierwiastkow
                                    delta=pow(d,2)-4*c*e;
                                    
                                                          if (delta!=0)
                                                          {
                                                          xo1=(-d+sqrt(delta))/(2*c);
                                                          xo2=(-d-sqrt(delta))/(2*c);
                                                          yo1=a2*xo1+b2;
                                                          yo2=a2*xo2+b2;
                                                          }  
                                                          else{
                                                          xo=(-d)/(2*c);
                                                          yo=a2*xo+b2;
                                                          }
                                    
                                     
                                    //eliminacja jednego z punktow
                                    //obliczanie wektorow ba=[f,g], bo1[h,i], bo2[j,k] 
                                    if(delta!=0){
                                    
                                                    f=xp-xb;
                                                    g=yp-yb;
                                                    h=xo1-xb;
                                                    i=yo1-yb;
                                                    j=xo2-xb;
                                                    k=yo2-yb;
                                                    if(f>0)f=1;else f=2;
                                                    if(g>0)g=1;else g=2;
                                                    if(h>0)h=1;else h=2;
                                                    if(i>0)i=1;else i=2;
                                                    if(j>0)j=1;else j=2;
                                                    if(k>0)k=1;else k=2;
                                                    if((f==h)&&(g==i)){
                                                                   yo=yo1;
                                                                   xo=xo1;
                                                                   }
                                                                   else{
                                                                        xo=xo2;
                                                                        yo=yo2;
                                                                        }
                                                    }
                                                    else {             
                                                          xo=(-d)/(2*c);
                                                         yo=a2*xo+b2;  
                                                         }
                                    
                                    
                                    //wyznaczam prosta przechodzaca przez punkt O i rownolegla do prostej l  y=ax+b3    
                                    b3=yo-a*xo;
                                    
                                    //wyznaczam srodki okregow z odleglosci punktow                
                                    l=1+pow(a,2);
                                    m=-2*xp+2*a*b3-2*a*yp;
                                    o=pow(xp,2)-pow(r,2)+pow(b3,2)+pow(yp,2)-2*b3*yp;                    
                                    delta2=pow(m,2)-4*l*o;
                                    
                                    if(delta2!=0){
                                                  x1=(-m+sqrt(delta2))/(2*l);
                                                  x2=(-m-sqrt(delta2))/(2*l);
                                                  y1=a*x1+b3;
                                                  y2=a*x2+b3;
                                                  aktualny->dane3 = x1; 
                                                  aktualny->dane4 = y1;
                                                  aktualny->dane5 = x2; 
                                                  aktualny->dane6 = y2;
                                                 } 
                                                 else{
                                                       x1=(-m)/(2*l);
                                                       y1=a*x1+b3;
                                                       aktualny->dane3 = x1; 
                                                       aktualny->dane4 = y1;
                                                       aktualny->dane5 = 0000; 
                                                       aktualny->dane6 = 0000;
                                                                                                        
                                                     }             
                                  
                                
                                    }
                                    else 
                                    cout<<"brak"<<endl;
                                    
                                    aktualny->dane3 = x1; 
                                    aktualny->dane4 = y1;
                                    aktualny->dane5 = x2; 
                                    aktualny->dane6 = y2;
                                    
                                    // teraz jest to ostatni element listy   
                                    aktualny->wsk_nastepnika = NULL;   
                                    // natomiast poprzedni ostatni już nie jest ostatnim   
                                    if (poprzedni != NULL) // Zabezpieczenie na początek         
                                      poprzedni->wsk_nastepnika = aktualny;    
                                    else    
                                      glowa = aktualny; 
                                }  
                                }
                                else{
                                     if(x11==x22){
                                                  for (int z=0;z<lp+1;z++){
                                                      xp=punkty[z].x;//punkty z pliku
                                                      yp=punkty[z].y;
                                                      
                                                      poprzedni = aktualny;   
                                                      // tworzymy nowy element    
                                                      aktualny = new element_listy;   
                                                      // zapisujemy do niego odczytane dane   
                                                      aktualny->dane1 = punkty[z].x; 
                                                      aktualny->dane2 = punkty[z].y;                                                       
                                                      if((xp-x11)>(0)){
                                                                       x1=x11+r;
                                                                       x2=x11+r;
                                                                       y1=yp+r;
                                                                       y2=yp-r;
                                                                       }
                                                                       else{
                                                                            x1=x11-r;
                                                                            x2=x11-r;
                                                                            y1=yp+r;
                                                                            y2=yp-r;
                                                                            }
                                                     
                                                      aktualny->dane3 = x1; 
                                                      aktualny->dane4 = y1;
                                                      aktualny->dane5 = x2; 
                                                      aktualny->dane6 = y2;
                                                      // teraz jest to ostatni element listy   
                                                      aktualny->wsk_nastepnika = NULL;   
                                                      // natomiast poprzedni ostatni już nie jest ostatnim   
                                                      if (poprzedni != NULL) // Zabezpieczenie na początek         
                                                      poprzedni->wsk_nastepnika = aktualny;    
                                                      else    
                                                       glowa = aktualny;
                                                      }
                                                  }
                                                      
                                                  else if(y11==y22){
                                                       for (int z=0;z<lp+1;z++){
                                                      xp=punkty[z].x;//punkty z pliku
                                                      yp=punkty[z].y;
                                                      
                                                      poprzedni = aktualny;   
                                                      // tworzymy nowy element    
                                                      aktualny = new element_listy;   
                                                      // zapisujemy do niego odczytane dane   
                                                      aktualny->dane1 = punkty[z].x; 
                                                      aktualny->dane2 = punkty[z].y;
                                                       if((yp-y11)>(0))
                                                       {
                                                       x1=xp+r;
                                                       x2=xp-r;
                                                       y1=y11+r;
                                                       y2=y11+r;
                                                       }
                                                       else{
                                                             x1=xp+r;
                                                             x2=xp-r;
                                                             y1=y11-r;
                                                             y2=y11-r;
                                                            }
                                                       
                                                     
                                                      aktualny->dane3 = x1; 
                                                      aktualny->dane4 = y1;
                                                      aktualny->dane5 = x2; 
                                                      aktualny->dane6 = y2;
                                                      // teraz jest to ostatni element listy   
                                                      aktualny->wsk_nastepnika = NULL;   
                                                      // natomiast poprzedni ostatni już nie jest ostatnim   
                                                      if (poprzedni != NULL) // Zabezpieczenie na początek         
                                                      poprzedni->wsk_nastepnika = aktualny;    
                                                      else    
                                                      glowa = aktualny; 
                                                      }
                                                      }
                                                      }
                                                      

drukuj_liste_rek(glowa);
zapis_list_it(glowa);


  getch();  
  return 0;
}
0

Skoro nikt nie odpowiada to ja odpowiem ;P Znalazłem błąd. Po prostu zapomniałem skasować fragmentu kodu który skopiowałem w inne miejsce. Było tak:

                                                  aktualny->dane3 = x1; 
                                                  aktualny->dane4 = y1;
                                                  aktualny->dane5 = x2; 
                                                  aktualny->dane6 = y2;
                                                 } 
                                                 else{
                                                       x1=(-m)/(2*l);
                                                       y1=a*x1+b3;
                                                       aktualny->dane3 = x1; 
                                                       aktualny->dane4 = y1;
                                                       aktualny->dane5 = 0000; 
                                                       aktualny->dane6 = 0000;
                                                                                                        
                                                     }             
                                  
                                
                                    }
                                    else 
                                    cout<<"brak"<<endl;
                                    
                                                  aktualny->dane3 = x1; 
                                                  aktualny->dane4 = y1;
                                                  aktualny->dane5 = x2; 
                                                  aktualny->dane6 = y2;
                                    
                                    // teraz jest to ostatni element listy   
                                    aktualny->wsk_nastepnika = NULL;   
                                    

a powinno by tak:


                                                  aktualny->dane3 = x1; 
                                                  aktualny->dane4 = y1;
                                                  aktualny->dane5 = x2; 
                                                  aktualny->dane6 = y2;
                                                 } 
                                                 else{
                                                       x1=(-m)/(2*l);
                                                       y1=a*x1+b3;
                                                       aktualny->dane3 = x1; 
                                                       aktualny->dane4 = y1;
                                                       aktualny->dane5 = 0000; 
                                                       aktualny->dane6 = 0000;
                                                                                                        
                                                     }             
                                  
                                
                                    }
                                    else 
                                    cout<<"brak"<<endl;
                                    
                                              
                                    
                                    // teraz jest to ostatni element listy   
                                    aktualny->wsk_nastepnika = NULL;   
                                    
</cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1