pekfos |
» 2014-07-03 21:57:31 1. Zły warunek. 2. Nie inkrementujesz i i również zły warunek, jeśli się czepiać. |
|
grzeso Temat założony przez niniejszego użytkownika |
» 2014-07-03 22:06:49 1. czemu zły? przecież eof zwraca true jak znajdzie koniec danych, czyli logicznie zrobiłem żeby sie kończyła petla jak znajdzie koniec 2. jak zainkrementuje "i" to wywala mi program. a poza tym jak wygląda to tak: #include <iostream> #include <fstream> #include <conio.h> using namespace std; int main() { fstream plik; plik.open( "dane.txt", ios::in ); if( plik.good() ) { string napis; cout << "Zawartosc pliku:" << endl; while( !plik.eof() ) { getline( plik, napis ); cout << napis << endl; } plik.close(); } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl; getch(); return( 0 ); }
to działa (znaczy nie tak jak chce, ale ogólnie działa) czyli na logikę zrobiłem tak samo z moja petla |
|
pekfos |
» 2014-07-03 22:10:02 1. Bo eof() sprawdza się po odczycie, a nie przed. 2. Bo wczytujesz ile wlezie, a w twoje tablice niewiele wlezie.. Dla odpowiedniego pliku pewnie nie zadziała. Rób tak: while( in >> abc >> def )
while( std::getline( asd, sdf ) )
Jeśli wystąpi błąd, plik się skończy itp, a sprawdzenie wystąpi po odczycie, to pętli obsłużysz dane z pewnością, że podczas ich wczytywania nie wystąpił błąd. Czyli dane będziesz mieć poprawne, a nie częściowo wyzerowane, a częściowo pomieszane ze starymi. |
|
Monika90 |
» 2014-07-03 22:16:04 nie działa, bo może wydrukować na końcu dodatkową pustą linię, której w pliku nie ma, albo nawet gorzej - może się zawiesić |
|
grzeso Temat założony przez niniejszego użytkownika |
» 2014-07-03 22:26:32 Tak wyglada mój program, ale nadal są bzdury #include <iostream> #include <fstream> #include <iomanip>>
using namespace std;
int main() { double n[ 50 ]; double x[ 50 ]; double y[ 50 ]; char comma; fstream plik; plik.open( "dane.txt" ); int i = 0; while( plik >> n[ i ] ) { plik >> n[ i ] >> comma >> x[ i ] >> comma >> y[ i ]; i++; } plik.close(); for( int j = 0; j < 50; j++ ) { std::cout << x[ j ] << std::endl; } std::cout << std::endl; for( int j = 0; j < 50; j++ ) { std::cout << y[ j ] << std::endl; } }
ale jeśli: int a; int i = 0; while( plik >> a ) { plik >> n[ i ] >> comma >> x[ i ] >> comma >> y[ i ]; i++; } to zadziała pod warunkiem że tablisa są małe, a mi chodzi o to żeby była duża. Monika90 masz racje, robi się dodatkowa linia |
|
Monika90 |
» 2014-07-03 22:31:35 jęzli dobrze rozmiem o co Ci chodzi to ma być tak int i = 0; while( i < 50 &&( plik >> n[ i ] >> comma >> x[ i ] >> comma >> y[ i ] ) ) { ++i; }
|
|
grzeso Temat założony przez niniejszego użytkownika |
» 2014-07-03 22:52:28 no właśnie nie.
to 50 to taki przykład tylko
chodzi o to żeby pętla wczytała tyle danych ile będzie w pliku, nieważne czy będzie ich 50 czy 17tys.
I jeśli zrobię pętle for i ograniczę ile ma być danych to działa, ale nie chce się ograniczać tylko żeby działało dla każdej ilości.
i problemem jest to ze nie umiem zrobić warunku kończącego tą pętle
i w tym co napisałaś jest wszystko fajnie tylko ze jak usunę ograniczenie ze max 50 to program się wywala |
|
Monika90 |
» 2014-07-03 23:01:46 struct Dane { double n, x, y; };
std::vector<Dane> dane;
i dodajesz elementy do wektora za pomocą push_back
|
|
1 « 2 » 3 4 5 |