Skocz do zawartości


Zdjęcie

[c++] problem z wczytywaniem z pliku


  • Zaloguj się, aby dodać odpowiedź
18 odpowiedzi w tym temacie

#1 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 17 04 2010 - 16:30

mam problem z wczytaniem danych z pliku,nie wiem czemu ale ZAWSZE otrzymuje błąd o niemożności otworzenia pliku...nie wiem w czym problem wiec bardzo prosiłbym o jakakolwiek pomoc.z góry dziękuję.

ifstream plik;
  plik.open("dane_sc.dt");
  if(!plik.is_open())
   {
     cout<<"blad: nie udalo sie otworzyc pliku\n\n";
     system("pause");
   }
  else
    while (!plik.eof())
     {
       plik>>ip;
       for(int i=0;i<ip;i++)
         plik>>tp[i].xa>>tp[i].ya>>tp[i].xb>>tp[i].yb>>tp[i].side;
       plik>>ik;
       for(int i=0;i<ik;i++)
         plik>>tk[i].xs>>tk[i].ys>>tk[i].r>>tk[i].side;
       plik>>GP;
     }
  plik.close();


  • 0

#2 izaw

izaw

    Początkujący

  • 97 postów

Napisano 18 04 2010 - 00:06

Najczęstszym powodem jest brak liku lub jest on w innym folderze.

  • 0

#3 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 18 04 2010 - 00:33

Najczęstszym powodem jest brak liku lub jest on w innym folderze.


plik istnieje i znajduje się w tym samym folderze...ta funkcja teoretycznie miała sprawdzać czy plik istnieje i pisać jeśli nie,a jeśli tak to wczytywać,ale niestety zawsze pisze jakby go nie było.w tym własnie tkwi cały problem...
  • 0

#4 izaw

izaw

    Początkujący

  • 97 postów

Napisano 18 04 2010 - 01:01

Co oznacza w tym samym folderze?
Uruchamiasz spod IDE (napisz jakiego) czy z konsoli. Jaka platforma?
  • 0

#5 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 18 04 2010 - 12:49

Spróbuj zamiast
if(!plik.is_open())

wpisać:
if(!plik)

Poza tym, trochę mnie zdziwiła pętla while(!plik.oef()), bo o ilę się nie mylę ifstream powoduje nadpisanie pliku, czyli po prostu usuwa stary plik i tworzy nowy

Użytkownik Katarina edytował ten post 18 04 2010 - 12:51

  • 0

#6 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 18 04 2010 - 19:40

Spróbuj zamiast

if(!plik.is_open())

wpisać:
if(!plik)


niestety rowniez nie dziala:(

Poza tym, trochę mnie zdziwiła pętla while(!plik.oef()), bo o ilę się nie mylę ifstream powoduje nadpisanie pliku, czyli po prostu usuwa stary plik i tworzy nowy


a to nie ofstream przypadkiem tak robi??;)
  • 0

#7 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 18 04 2010 - 20:02

Racja - ofstream pomylił mi się z ifstream - bardzo przepraszam ;)
  • 0

#8 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 19 04 2010 - 00:27

Racja - ofstream pomylił mi się z ifstream - bardzo przepraszam ;)

nie ma sprawy,zdarza się nawet mistrzom:P

a temat pozostaje otwarty,jeśli ktoś ma jakiś pomysł jak to poprawić lub jak inaczej rozwiązać zagadnienie to bardzo proszę o pomoc
  • 0

#9 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 19 04 2010 - 18:29

Powtórzę może pytanie izaw: w jakim środowisku programujesz?
  • 0

#10 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 19 04 2010 - 20:58

najmocniej przepraszam,musiałem nie zauważyć tej wypowiedzi:uruchamiam z msdosa lub bezposrednio z winXP,w tym samym znaczy w tym samym,powiedzmy np ze oba pliki sa na pulpicie,a pisze w devC++
  • 0

#11 izaw

izaw

    Początkujący

  • 97 postów

Napisano 19 04 2010 - 21:32

1. Czy to twój kod? Sam go kompilowałeś i masz cały projekt, w tym kod programu?
2. Z dosa to raczej nie uruchomisz. MSDos jest 16 bitowy, a kompilator Deva jest 32 bitowy. Możesz co najwyżej w oknie konsoli.
3. Wyświetla ci komunikat o braku dostępu do pliku?
4. Sprawdź czy nazwa w kodzie źródłowym dokładnie odpowiada nazwie pliku.
5. Próbowałeś uruchomić spod Deva? Oczywiście plik musi być w folderze projektu.
6. Masz ustawione pokazywanie rozszerzeń znanych plików? Może plik ma nazwę dane_sc.dt.txt ?
7. Zainstaluj sobie VisualStudio 2008EE. Jest darmowe i znacznie lepsze. Dev od lat jest nie rozwijany trzeba umieć go uaktualnić. Do tego ma słaby debugger.

  • 0

#12 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 19 04 2010 - 21:33

Tzn. że plik, z którego chcesz czytać i plik programu (exe) są na pulpicie? Mi kawałek kodu odpowiadający za otworzenie pliku txt działa poprawnie (też uruchomiłam w Dev-C++). A możesz wkleić kod całego programu?

  • 0

#13 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 19 04 2010 - 22:01

1. Czy to twój kod? Sam go kompilowałeś i masz cały projekt, w tym kod programu?
2. Z dosa to raczej nie uruchomisz. MSDos jest 16 bitowy, a kompilator Deva jest 32 bitowy. Możesz co najwyżej w oknie konsoli.
3. Wyświetla ci komunikat o braku dostępu do pliku?
4. Sprawdź czy nazwa w kodzie źródłowym dokładnie odpowiada nazwie pliku.
5. Próbowałeś uruchomić spod Deva? Oczywiście plik musi być w folderze projektu.
6. Masz ustawione pokazywanie rozszerzeń znanych plików? Może plik ma nazwę dane_sc.dt.txt ?
7. Zainstaluj sobie VisualStudio 2008EE. Jest darmowe i znacznie lepsze. Dev od lat jest nie rozwijany trzeba umieć go uaktualnić. Do tego ma słaby debugger.

1.a i owszem moj
2.tak,mialme na mysli konsole wlasnie
3.nie tyle komunikat,co sama funcja wypisuje to co powinna dla nieistniejacego pliku
mam na mysli te linie
cout<<"blad: nie udalo sie otworzyc pliku\n\n";

4.dokladnie odpowiada
5.niestey to nic nie daje
6.nei ma,bo jest tworzony przez inna funkcje tego projektu,pztm mam ustawione pokazywanie
7.byc moze ale sie przyzwyczailem a programy pisze sporadycznie,wiec dev mi starcza

Tzn. że plik, z którego chcesz czytać i plik programu (exe) są na pulpicie? Mi kawałek kodu odpowiadający za otworzenie pliku txt działa poprawnie (też uruchomiłam w Dev-C++). A możesz wkleić kod całego programu?


tak,sa na pulpicie

niby moge ale od razu zaznaczam ze program jest nieskonczony a pztm pewnie masakrycznie niepoprawny z bledami i niewydajny...pztm nie wiem w czym moze pomoc,wkleilem cala funkcje jest do niej wywolanie z maina powinno dzialac a nie za bardzo chce:P
  • 0

#14 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 19 04 2010 - 22:18

Lepiej podziel się kodem całego programu, może gdzieś indziej siedzi jakiś robaczek. Poza tym - taka rada na przyszłość: kiedy tworzysz programy, to po kolei sprawdzaj, czy poszczególne, nazwijmy to, "moduły" działają. Najpierw się kończy pisać jedną rzecz - trzeba to przetestować. Jeżeli działa, to bierzemy się za kolejną część programu. Ostatnio intensywnie trenuję ten sposób pisania programów i naprawdę polecam ;)

Użytkownik Katarina edytował ten post 19 04 2010 - 22:26

  • 0

#15 izaw

izaw

    Początkujący

  • 97 postów

Napisano 19 04 2010 - 22:42

Jeżeli nie dasz więcej kodu, to trudno coś poradzić.

Mam jeszcze jedną radę. Możesz mieć strumień w stanie błędu. Wtedy nie można wykonać na nim żadnej operacji. Spróbuj użyć metody clear do naprawy strumienia, ale może nie pomóc, a nawet gdy pomoże to jest zwykle niepewne. Gdzieś w kodzie musi być błąd, który może ujawniać się w przypadkowych momentach.
  • 0

#16 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 20 04 2010 - 10:57

Lepiej podziel się kodem całego programu, może gdzieś indziej siedzi jakiś robaczek. Poza tym - taka rada na przyszłość: kiedy tworzysz programy, to po kolei sprawdzaj, czy poszczególne, nazwijmy to, "moduły" działają. Najpierw się kończy pisać jedną rzecz - trzeba to przetestować. Jeżeli działa, to bierzemy się za kolejną część programu. Ostatnio intensywnie trenuję ten sposób pisania programów i naprawdę polecam ;)



ja od zawsze bylem tak uczony:P wszystkie poprzednie funkcje działają ale, jeśli to potrzebne podaje kod [tylko jak zastrzegałem pewnie mnóstwo w nim błędów przestarzałych funkcji etc,wiec proszę nie wyklnijcie mnie:P]

ps,program jak pisałem nie jest jeszcze skończony,wiec nie dziwcie sie niektórym rzeczom:P

#include "h1.hpp"bool A[Nn][Nn];short int ip=0,ik=0;string e="";char w;float GP=0;struct line{  float xa,ya,xb,yb;  bool side;};struct circle{  float xs,ys,r;  bool side;};struct line tp[6];struct circle tk[6];//------------------------------------------------------------------------------void av(){  do   {     system("cls");     if(e!="")      {        if(e=="E6")          cout<<"blad "<<e<<": wcisnieto niewlasciwy klawisz\n\n";        if(e=="E8")          cout<<"blad "<<e<<": wczytales juz maksymalna liczbe prostych\n\n";        e="";      }     cout<<"czy chcesz:\n\n";     cout<<"dodac [P]rosta\n";     cout<<"dodac o[K]rag\n";     cout<<"okreslic wartosc [G]estosci powierzchniowej\n";     w=getch();     if(toupper(w)=='P')       if(ip<6)        {          system("cls");          struct line templ;          czyt_p:          cout<<"podaj wspolrzedna x dla pierwszego punktu:\n";          templ.xa=czytaj_float(Nn+0.001);          cout<<"podaj wspolrzedna y dla pierwszego punktu:\n";          templ.ya=czytaj_float(Nn+0.001);          czyt_p2:          cout<<"podaj wspolrzedna x dla drugiego punktu:\n";          templ.xb=czytaj_float(Nn+0.001);          cout<<"podaj wspolrzedna y dla grugiego punktu:\n";          templ.yb=czytaj_float(Nn+0.001);          if(templ.xa==templ.xb&&templ.ya==templ.yb)           {             system("cls");             cout<<"blad E7: podano dwa razy ten sam punkt\n\n";             do              {                if(e!="")                 {                   cout<<"blad "<<e<<": wcisnieto niewlasciwy klawisz\n\n";                   e="";                 }                cout<<"[P]opraw tylko drugi punkt\n";                cout<<"[W]czytaj ponownie oba punkty\n";                w=getch();                if(toupper(w)=='P')                  goto czyt_p2;                else if(toupper(w)=='W')                  goto czyt_p;                else e="E6";              }             while(e!="");           }          do           {             system("cls");             if(e!="")              {                cout<<"blad "<<e<<": wcisnieto niewlasciwy klawisz\n\n";                e="";              }             cout<<"podaj,ktora strona prostej Cie interesuje:\n";             cout<<"[P]rawa    [L]ewa\n";             cout<<"patrzac wzdluz wektora rozpinajacego AB,gdzie:\n";             cout<<"A=("<<templ.xa<<","<<templ.ya<<")\n";             cout<<"B=("<<templ.xb<<","<<templ.yb<<")\n";             w=getch();             if(toupper(w)=='P')               templ.side=true;             else if(toupper(w)=='L')               templ.side=false;             else               e="E6";           }          while(e!="");          tp[ip]=templ;          ip++;        }       else        e="E8";     else if(toupper(w)=='K')       if(ik<6)        {          struct circle tempc;          cout<<"podaj wspolrzedna x dla srodka okregu:\n";          tempc.xs=czytaj_float(Nn+0.001);          cout<<"podaj wspolrzedna y dla srodka okregu:\n";          tempc.ys=czytaj_float(Nn+0.001);          cout<<"podaj promien okregu:\n";          tempc.r=czytaj_float(Nn+0.001);          do           {             system("cls");             if(e!="")              {                cout<<"blad "<<e<<": wcisnieto niewlasciwy klawisz\n\n";                e="";              }             cout<<"podaj,ktory obszar Cie interesuje:\n";             cout<<"[W]netrze    [Z]ewnetrze\n";             cout<<"okregu o srodku w punkcie ";             cout<<"A=("<<tempc.xs<<","<<tempc.ys<<")\n";             cout<<"i promieniu r="<<tempc.r<<endl;             w=getch();             if(toupper(w)=='P')               tempc.side=true;             else if(toupper(w)=='L')               tempc.side=false;             else               e="E6";           }          while(e!="");          tk[ik]=tempc;          ik++;        }       else         e="E9";     else if(toupper(w)=='G')       if(GP!=0)        {          do           {             system("cls");             if(e!="")              {                cout<<"blad "<<e<<": wcisnieto niewlasciwy klawisz\n\n";                e="";              }             cout<<"obecnie jest juz okreslona wartosc gestosci powierzchniowej\ni wynosi ona "<<GP<<endl;             cout<<"czy chcesz:\n";             cout<<"[O]kreslic nowa wartosc,zastepujac obecna;\n";             cout<<"[P]ozostawic obecna wartosc;\n";             w=getch();             if(toupper(w)=='O')               GP=czytaj_float(SGP);             else if(toupper(w)=='P')               break;             else               e="E6";           }          while(e!="");        }       else        GP=czytaj_float(SGP);     else       e="E6";   }  while(e!="");}//------------------------------------------------------------------------------void RF(){  system("cls");  ifstream plik;  plik.open("dane_sc.dt");  if(!plik)   {     cout<<"blad E10: nie udalo sie otworzyc pliku\n\n";     system("pause");   }  else    while (!plik.eof())     {       plik>>ip;       for(int i=0;i<ip;i++)         plik>>tp[i].xa>>tp[i].ya>>tp[i].xb>>tp[i].yb>>tp[i].side;       plik>>ik;       for(int i=0;i<ik;i++)         plik>>tk[i].xs>>tk[i].ys>>tk[i].r>>tk[i].side;       plik>>GP;     }  plik.close();}//------------------------------------------------------------------------------bool cnl(struct line T,float x0,float y0){  float y;  y=(((T.yb-T.ya)*(x0-T.xa))/(T.xb-T.xa))+T.ya;  if(T.side==true)   {    if(y0<=y)      return true;    else      return false;   }  else   {     if(y0>=y)       return true;     else       return false;   }}//------------------------------------------------------------------------------void tab(){  for(int l=0;l<ip;l++)   {     struct line T=tp[l];     if(T.xa!=T.xb)       if(T.ya!=T.yb)         for(int i=0;i<Nn;i++)           for(int j=0;j<Nn;j++)             if(A[i][j]==true)               A[i][j]=cnl(T,j+0.5,Nn+0.5-i);             else               continue;       else         if(T.side==true)           for(int i=0;i<round(T.ya)-1;i++)             for(int j=0;j<Nn;j++)               A[i][j]=false;         else           for(int i=round(T.ya);i<Nn;i++)             for(int j=0;j<Nn;j++)               A[i][j]=false;     else       if(T.side==true)         for(int i=0;i<Nn;i++)           for(int j=0;j<round(T.xa)-1;j++)             A[i][j]=false;       else         for(int i=0;i<Nn;i++)           for(int j=round(T.xa);j<Nn;j++)             A[i][j]=false;   }}//------------------------------------------------------------------------------void save_data(){  ofstream plik;  plik.open("dane_sc.dt");  plik<<ip<<endl;  for(int i=0;i<ip;i++)    plik<<tp[i].xa<<" "<<tp[i].ya<<" "<<tp[i].xb<<" "<<tp[i].yb<<" "<<tp[i].side<<endl;  plik<<ik<<endl;  for(int i=0;i<ik;i++)    plik<<tk[i].xs<<" "<<tk[i].ys<<" "<<tk[i].r<<" "<<tk[i].side<<endl;  plik<<GP;  plik.close();}//------------------------------------------------------------------------------void wrt(){  system("cls");  if(ip==0)    cout<<"aktualnie nie masz wczytanych zadnych prostych;\n";  else   {     cout<<"aktualnie masz wczytane nastepujace proste:\n";     for(int i=0;i<ip;i++)      {        cout<<i+1<<". pkt A=("<<tp[i].xa<<","<<tp[i].ya<<"), pkt B=("<<tp[i].xb<<","<<tp[i].yb<<")\n";        if(tp[i].side==true)          cout<<"wybrano prawa strone dla tej prostej;\n";        else          cout<<"wybrano lewa strone dla tej prostej;\n";      }   }  if(ik==0)    cout<<"aktualnie nie masz wczytanych zadnych okregow;\n";  else   {     cout<<"aktualnie masz wczytane nastepujace okregi:\n";     for(int i=0;i<ik;i++)      {        cout<<i+1<<". pkt S=("<<tk[i].xs<<","<<tk[i].ys<<"), r="<<tk[i].r<<endl;        if(tk[i].side==true)          cout<<"wybrano wnetrze tego okregu;\n";        else          cout<<"wybrano zewnetrze tego okregu;\n";      }   }  if(GP==0)    cout<<"aktualnie nie wczytano zadnej wartosci dla gestosci powierzchniowej;\n";  else    cout<<"wczytana wartosc gestosci powierzchniowej wynosi: "<<GP<<endl;  system("pause");}//------------------------------------------------------------------------------void edit_data(){  do   {     system("cls");     if(e!="")      {        cout<<"blad E6: wcisnieto niewlasciwy klawisz\n\n";        e="";      }     if(ip==0&&ik==0&&GP==0)      {        cout<<"nie posiadasz zadnych danych do edycji,wpierw wczytaj dane\n\n";        system("pause");        break;      }     else       cout<<"czy chcesz:\n";     if(ip!=0)       cout<<"edytowac [P]rosta\n";     if(ik!=0)       cout<<"edytowac [O]krag\n";     if(GP!=0)       cout<<"edytowac wartosc [G]estpsci powierzchniowej\n";     w=getch();     if(toupper(w)=='P'&&ip!=0)       cout<<"edit prosta\n";     else if(toupper(w)=='O'&&ik!=0)       cout<<"edit okrag\n";     else if(toupper(w)=='G'&&GP!=0)       GP=czytaj_float(SGP);     else       e="E6";   }  while(e!="");}//------------------------------------------------------------------------------int main(){  char W;  do   {     W=menu();     if(W=='N')       av();     else if(W=='W')       RF();     else if(W=='P')       wrt();     else if(W=='E')       edit_data();     else if(W=='R')      {        for(int i=0;i<Nn;i++)          for(int j=0;j<Nn;j++)            A[i][j]=true;        tab();        system("cls");for(int i=0;i<Nn;i++){for(int j=0;j<Nn;j++) cout<<A[i][j];cout<<endl;}getch();}   }  while(W!='Q');  save_data();  system("cls");  cout<<"LSCv0.2beta\n";  cout<<"dziekujemy za prace z programem;\n\n(C) 2010 by Venom Morph\n";  Sleep(2200);  return 0;}

PS2 niektóre rozwiązania są tylko tymczasowe.

Użytkownik Katarina edytował ten post 20 04 2010 - 15:11

  • 0

#17 izaw

izaw

    Początkujący

  • 97 postów

Napisano 20 04 2010 - 13:56

Żeby kod porządnie skomentować trzeba by napisać drugie tyle.

Chociażby używanie w C struktur zamiast klas i używana składnia C, zmienne globalne, fatalny styl pisania kodu: choćby ładowanie kilku instrukcji do jednej linii. Łatwo później o pomyłki.

Odnośnie błędu, podtrzymuję spróbowanie naprawy strumienia przed otwarciem. Poprzednia operacja na strumieniu mogła zakończyć się błędem. A już na pewno sprawdzenie stanu strumienia dałoby jakąś informację.
  • 0

#18 Venom Morph

Venom Morph

    Początkujący

  • 26 postów

Napisano 20 04 2010 - 19:35

Żeby kod porządnie skomentować trzeba by napisać drugie tyle.

Chociażby używanie w C struktur zamiast klas i używana składnia C, zmienne globalne, fatalny styl pisania kodu: choćby ładowanie kilku instrukcji do jednej linii. Łatwo później o pomyłki.

Odnośnie błędu, podtrzymuję spróbowanie naprawy strumienia przed otwarciem. Poprzednia operacja na strumieniu mogła zakończyć się błędem. A już na pewno sprawdzenie stanu strumienia dałoby jakąś informację.

ostrzegałem ze jest fatalny,choć np nie wiem o co chodzi ze zmiennymi globalnymi....
co do instrukcji:zazwyczaj jest jedna,tam gdzie jest kilka jest to tylko tymczasowo i zdaje sobie z tego sprawę...

co do problemu rozwiązał się sam,kod zaczął sam z siebie działać niezmieniony,temat do zamkniecia:P
  • 0

#19 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 20 04 2010 - 20:37

W takim razie co do zmiennych globalnych - programiści nie powinni używać zmiennych globalnych. Od momentu zadeklarowania takiej zmiennej, jest ona ważna cały czas, nawet jak nie jest używana nigdzie. Tutaj masz parę argumentów przeciw używaniu zmiennych globalnych: http://pl.wikipedia.org/wiki/Zmienna_globalna
Zamiast tego, możesz zadeklarować zmienne w main, a potem w funkcjach odwoływać się do nich przez referencję (dzięki czemu są one "fizycznie" zmieniane, nie działamy na kopiach - chociaż pracując z tablicami, to właściwie zawsze pracujemy na oryginalnej tablicy, dzięki wskaźnikom)

  • 0

Zobacz więcej tematów z tagiem: język C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych