Ĺ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
#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
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
llkażda linijka to osobny zestaw danychl
#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.