[C++]Wczytywanie kolejnej linii z pliku do wektora.

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

[C++]Wczytywanie kolejnej linii z pliku do wektora.

Post autor: zenzee » 09 maja 2009, 20:59

Witam.
Chcę wczytać kolejne linie tekstu z liczbami typu int z pliku.
Ponieważ, nie wiem ile linii może być to pomyślałem,że do tego celu
świetnie nada się wektor.
Proszę o sprawdzenie poprawności zapisu kodu.
Z góry przepraszam za komentarze :razz:
Dzieki wielkie. :grin:

Kod: Zaznacz cały

//---------------------------------------------------------------------------
#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

int main()
{

char TabChar[11];//do tej tablicy chce wczytac kolejne linie tekstu z pliku

vector<int>Tab;//tworze pusty wektor int-ów

 int IloscLiniiWczytanychZPliku = 0;//do tej zmiennej
  //wczytam wielkosc wektora Tab


  ifstream PlikDoOtwarcia("Tekst.dat");//otwieram zadany plik do odczytu

    if(!PlikDoOtwarcia)return 0;//nie ma takiego pliku to zwróc 0

    //dopóki nie napotkamy znaku konca pliku
while(!PlikDoOtwarcia.getline(TabChar,sizeof(TabChar)-1).eof())
  // to odczytujemy kolejne linie do tablicy TabChar
      {

   Tab.push_back(atoi(TabChar));//tutaj wpisujemy do wektora Tab kolejne
   //liczby typu int,ale przedtem oczywiscie dokonujemy konwersji każdej lini
   //tekstu z char na int poprzez funkcje atoi();

          }
PlikDoOtwarcia.close();//zamykamy plik

//odczytujemy ilosc elementow
  IloscLiniiWczytanychZPliku = Tab.size(); 
     cout<< "Wczytanych lini do wektora Tab jest : "<< IloscLiniiWczytanychZPliku<<"\n";
   //w wektorze Tab;

cout << "A to jest zawartosc wektora Tab"<< endl;

// w tej pętli odczytuję zawartosc wektora Tab
   for(int ZawartoscWektora=0;ZawartoscWektora< IloscLiniiWczytanychZPliku;
++ZawartoscWektora)
{
  cout<<Tab[ZawartoscWektora]<< endl;
  }

system("pause");//poczekaj na wcisniecie jakiegos klawisza

        return 0;//zakoncz
        }
//---------------------------------------------------------------------------


MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 09 maja 2009, 22:31

zenzee, jak pierwszy raz to zobaczyłem, oklapłem. Przesadzasz.
1.Jak możesz użyć zwykłej tablicy dynamicznej, to niepotrzebny ci vector. (długo jeszcze będę pamiętał twoje 10 ifów w rzędzie :razz: )
2.Jest coś takiego jak cin na plikach.

Kod: Zaznacz cały

int i;
plik>>i;
Nie lepsze?
3.Puenta. (bez niej nie byłoby 1.) Nie możesz wczytać pliku dwa razy, za pierwszym razem policzyć liczby, a za drugim je wczytać?

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 09 maja 2009, 22:57

Wiem o tym :grin: .
Dzisiaj o wektorze przeczytałem i chcę tylko wiedzieć,czy w miarę dobrze to napisałem.
Podobno nie muszę wtedy martwić się też o przydział pamieci i nie muszę tego niszczyć w programie.
A liczb bedzie może też z 1000000. :mrgreen:

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 09 maja 2009, 23:19

O czym wiesz?
Kod jest OK, jeżeli tylko ci działa. Jest bardzo niezrozumiały w części odczytu pliku. C++ powstało po to, by być językiem "ładnym" i mimo to wydajnym, więc nie ma po co udziwniać.
Używasz Vectora bardzo dobrze, wręcz idealnie w tym zastosowaniu. Jednak z powodów dydaktycznych powinieneś używać bardziej "przyziemnych" metod, jak choćby tablicy dynamicznej. Ilość liczb naprawdę nietrudno jest wydobyć.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 09 maja 2009, 23:36

Do "ładnego" pisania kodu jeszcz dłuuuuuga droga. :razz:
No to wektor w tym wydaniu pojąłem.
Fajnie.Tylko tyle chciałem wiedzieć.
Pozdrawiam.

[ Dodano: 2009-05-10, 01:28 ]
MiW pisze:Jest bardzo niezrozumiały w części odczytu pliku.
Nie wiem co w tym jest niezrozumiałe.
Pewnie,że można to na 100 sposobów zapisać:jak komu pasuje. :wink:
Działa,systemu nie rozsadza.
Pisać trzeba się uczyć,a nie tak od razu.... :razz:

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 10 maja 2009, 10:04

Kod: Zaznacz cały

while(!plik.eof())
{int a;
Tab.push_back(a);}
Nie ładniej?

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 10 maja 2009, 11:04

I co mam wczytać do wektora,pustego int-a :grin:
Lepiej,aczkolwiek nie do końca tak jest :

Kod: Zaznacz cały

while(!PlikDoOtwarcia.eof()) 
{
	int a;
	PlikDoOtwarcia>>a; 
Tab.push_back(a); 
          }
Zmienną "int a" nie lepiej dać poza petlą?

[ Dodano: 2009-05-10, 16:54 ]
Całość wtedy może być taka(można pisać na wiele różnych sposobów).

Kod: Zaznacz cały

#include<iostream>
#include<fstream>
#include<vector>

using namespace std;
int main()
{

 vector<int>Tab;//tworze pusty wektor int-ów
  
 int IloscLiniiWczytanychZPliku = 0;//do tej zmiennej
    //wczytam wielkosc wektora Tab
  
ifstream PlikDoOtwarcia("Tekst.dat");//otwieram zadany plik do odczytu
     if(!PlikDoOtwarcia)return 0;//nie ma takiego pliku to zwróc 0

       
//dopóki nie napotkamy znaku konca pliku
	int a;
	while(!PlikDoOtwarcia.eof()) 
{
	PlikDoOtwarcia>>a; 
      Tab.push_back(a); 
          }// to odczytujemy kolejne linie do vector-a Tab  

 PlikDoOtwarcia.close();//zamykamy plik
    
   IloscLiniiWczytanychZPliku = Tab.size()-1; 
  
  //odczytujemy ilosc elementow
   cout<< "Wczytanych lini do wektora Tab jest : "<< IloscLiniiWczytanychZPliku<<"\n";
   //w wektorze Tab;

cout << "A to jest zawartosc wektora Tab"<< endl;

// w tej pętli odczytuję zawartosc wektora Tab
for(int ZawartoscWektora=0;ZawartoscWektora< IloscLiniiWczytanychZPliku;
++ZawartoscWektora)
{
cout<<Tab[ZawartoscWektora]<< endl;
}

system("pause");//poczekaj na wcisniecie jakiegos klawisza

        return 0;//zakoncz
        }
//---------------------------------------------------------------------------
 

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 10 maja 2009, 21:29

Przepraszam za błąd, dokładnie o to mi chodziło.

Kod: Zaznacz cały

int a;
ma być w pętli - używasz zmiennej a gdzie indziej?
W ANSI C (bez++) takie praktyki były niestety nie do pomyślenia.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 10 maja 2009, 21:43

Kod: Zaznacz cały

int a;
Racja akurat tutaj nigdzie indziej :razz:

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 10 maja 2009, 22:13

Dlaczego używać zmiennych lokalnie?
1. Nie mylą się i nie trzeba wyszukiwać udziwnionych nazw. Np. wszystkie indeksy pętli mogą nazywać się tak samo, o ile nie są jedne w drugich.
2. Ważniejsze. Kompilator C++ to niesłychanie mądre zwierzę. Jeżeli zmienna ma być dostępna tylko przez chwilę, zostanie jej również tylko na chwilę zarezerwowana pamięć (lub rejstry wewnętrzne). Nie jest wykluczone, że zmienna właściwie nie będzie istnieć, dane będą przesyłane między funkcjami bez jej pośrednictwa.
3. Choćbyś i 10 razy deklarował zmiene i potem kończyły się im zakresy ważności (nawiasy klamrowe w których są), najprawdopodobniej będzie to jedna i ta sama komórka pamięci (sprawdzone ;P). Nic się nie marnuje.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 11 maja 2009, 0:07

Dane przyjęte :wink:

[ Dodano: 2009-05-11, 22:26 ]
MiW pisze:O czym wiesz?
Kod jest OK, jeżeli tylko ci działa. Jest bardzo niezrozumiały w części odczytu pliku. C++ powstało po to, by być językiem "ładnym" i mimo to wydajnym, więc nie ma po co udziwniać.
Nie żebym się czepiał.
Stephen Prata napisał o C++:
Stroustrupowi najbardziej zależało na tym,aby język C++ był wygodny w użyciu,a nie na
wymuszaniu jakiejś konkretnej filozofii czy stylu programowania.
Faktyczne potrzeby programistów są ważniejsze od teoretycznej poprawności i elegancjii.
Taka puenta na koniec. :wink:

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 12 maja 2009, 20:26

Złapał za słowo i nie puści :grin:
C++ powstało po to, by być językiem "ładnym" i mimo to wydajnym,
Chciałem powiedzieć że w C++ kod "ładniejszy" nie jest wcale gorszy, co dzieje się w innych językach.
Prata dobrze powiedział i zgadzam się z tym. Właściwie to dlatego C++ jest tak popularne.
Jednak uważam, że chyba trochę źle zrozumiałeś moje słowa. Chciałem uczulić Cię na dwie kwestie:
1. Kod programu musi być czytelny dla ludzi, czasami nawet innych od autora. Kod prosty ma tę wielką zaletę, więc nie ma po co go udziwniać.
2. Kompilator C++ to przemądry stwór, który cudownie optymalizuje kod. Niestety jednak nie umie czytać w myślach programisty, więc jeżeli ten chce zrobić "po swojemu", kompilator już nie optymalizuje.
Nie wiem więc czy w tym konkretnym przypadku jest sens pisania inaczej niż piszą w samouczkach i podręcznikach. I chyba w wielu innych przypadkach też.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 12 maja 2009, 21:14

1.Wydawało mi się,że jest prosty,ale tylko wydawało mi się. :grin:
2.Może i nie,ale wszystkiego trzeba spróbować i coś "popsuć",a "psowacz" ze mnie wielki. :mrgreen:

Wielkie dzięki MiW,starczy tego ochrzanu :grin:

ODPOWIEDZ