ďťż

Ładny brzuch

Witam!
Mam następujący problem. Otóż mam plik wyglądający mniej więcej tak:

2 58 35 -5.4 2 58
35 -5.4 3.2 3.2 3 2
-5.4 2 58 4 6 5

    lkażdą liczbę oddzieloną conajmniej jedną spacją mam zapisać w komórce tablicy
    l
    lkażda linijka to osobny zestaw danychl
napisałem następujący programik:
#include <iostream> #include <fstream> #include <cstdlib> using namespace std; double tablica[6]; ifstream plik; int skoczDoLinii(std::istream &plik, int ktora) { string schowek; for(int i=1; i!=ktora && !plik.eof(); i++) { std::getline(plik,schowek,'\n'); } if(plik.good()) return 1; else if (plik.fail()) return -1; } int main() { plik.open("przyklad.txt"); if (plik.fail()) { cout << "Nie mozna otworzyc pliku do odczytu"; exit(1); } for(int j = 1; !plik.eof() ; j++) { skoczDoLinii(plik, j); cout << j; for(int i = 0; i < 6; i++) { plik >> tablica[i]; } for (int k = 0; k < 6; k++) { cout << "\ndana: " << tablica[k]; } cout << endl << endl; } plik.close(); system("PAUSE"); return 0; }
Niestety coś tu jest nie tak, bo program wypisuje pierwszą linijkę pliku jeden raz a drugą dwa razy. Trzeciej nawet nie próbuje.
Proszę o analizę tego kodu. Może jak ktoś z zewnątrz looknie to zobaczy błąd, bo mnie już brakło pomysłów.



wg mnie tu lezy problem
for(int i=1; i!=ktora && !plik.eof(); i++) { std::getline(plik,schowek,'\n'); }

powinno byc (...) int i=0 (...)
ale nie moge tego sprawdzic narazie, poza tym to juz prawie 3cia w nocy ;)


powinno byc (...) int i=0 (...)
dzięki, że zaglądnąłeś do tego :) niestety nie tędy droga. :( Po takiej modyfikacji program gubi pierwszą linijkę pliku a drugą wypisuje 2 razy. :blink: Trzeciej nie rusza wcale. <_<

petla jest dobra do gdy bedziesz chcial pierwsza linie to w Twoim przypadku nigdy nie powinno zadzialac..

a dlaczego w pierwszej petli Ci wysweitla liczby z pierwszego wiersza??

powodem jest to ze dwa razy zczytujesz zdane z pliku:

-raz w tej funkcji skoczDoLinii(plik, j);
-drugi w tej petli for(int i = 0; i < 6; i++) plik >> tablica[i];

nie wiem co chciales przez to uzyskac, wiec dalej Ci nie moge pomoc

jesli chciales wczytac te dane i potme je wypisac, to najkrotszym sposobem (takim gdzie bedzie najmniej modyfikacji) IMHO wystarczy ze przezkazesz do funkcji skoczDoLinii wskaznik do tablicy i tma wczytasz RAZ dane..



W zasadzie nie wiem po co Ci funkcja skoczDoLinii(...), skoro w main'ie po raz drugi wczytujesz wszystkie dane?
Ja rozwiązałem to w ten sposób:

#include <iostream> #include <fstream> #include <cstdlib> using namespace std; double tablica[6]; ifstream plik; int main() { plik.open("przyklad.txt"); if (plik.fail()) { cout << "Nie mozna otworzyc pliku do odczytu"; exit(1); } int j=1; while(1) { //skoczDoLinii(plik, j); for(int i = 0; i < 6 && !plik.eof(); i++) plik >> tablica[i]; if(plik.eof()) break; cout << j++; for (int k = 0; k < 6; k++) cout << "\ndana: " << tablica[k]; cout << endl << endl; } plik.close(); system("PAUSE"); return 0; }

wlasnie, zapomnialbym..

o ile rzeczywiscie jest Ci potrzebna ta funkcja skoczDoLinii to przed kazdym jej wywolaniem bedziesz musial restartowac plik (mozna to zrobic zamykajac plik i znow go otwierajac -sa jeszcze jakies funkcje na to, ale w tej chwili nie pamietam ich)

jesli wystarcyz Ci wypisanie wszystkeigo na ekran to to co kolega napisal wyzej wystarczy ;)

Rzeczywiście działa:) oczywiście funkcja skoczDoLinii() jest mi nie potrzebna. Dzięki fest za cenny czas fernandez. Chylę czoła.
Uroczyście ogłaszam zamknięcie tematu.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •