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();

[c++] problem z wczytywaniem z pliku
#1
Napisano 17 04 2010 - 16:30
#2
Napisano 18 04 2010 - 00:06
#3
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...
#4
Napisano 18 04 2010 - 01:01
Uruchamiasz spod IDE (napisz jakiego) czy z konsoli. Jaka platforma?
#5
Napisano 18 04 2010 - 12:49
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
#6
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??

#7
Napisano 18 04 2010 - 20:02

#8
Napisano 19 04 2010 - 00:27
nie ma sprawy,zdarza się nawet mistrzom:PRacja - ofstream pomylił mi się z ifstream - bardzo przepraszam
a temat pozostaje otwarty,jeśli ktoś ma jakiś pomysł jak to poprawić lub jak inaczej rozwiązać zagadnienie to bardzo proszę o pomoc
#9
Napisano 19 04 2010 - 18:29
#10
Napisano 19 04 2010 - 20:58
#11
Napisano 19 04 2010 - 21:32
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.
#12
Napisano 19 04 2010 - 21:33
#13
Napisano 19 04 2010 - 22:01
1.a i owszem moj1. 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.
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
#14
Napisano 19 04 2010 - 22:18

Użytkownik Katarina edytował ten post 19 04 2010 - 22:26
#15
Napisano 19 04 2010 - 22:42
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.
#16
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
#17
Napisano 20 04 2010 - 13:56
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ę.
#18
Napisano 20 04 2010 - 19:35
ostrzegałem ze jest fatalny,choć np nie wiem o co chodzi ze zmiennymi globalnymi....Ż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ę.
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
#19
Napisano 20 04 2010 - 20:37
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)
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych