• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

getline , jak działa ?

Object Storage Arubacloud
0 głosów
1,691 wizyt
pytanie zadane 10 kwietnia 2019 w C i C++ przez cyrus33 Użytkownik (680 p.)

Witam , na starcie powiem, że widziałem podobny temat jednak nie zrozumiałem do końca zasady działania ,a chciałbym ją poznać w 100% . W filmie pana Zelenda o obiektowym c++ odcinek 2 , jest taki fragment kodu

   string linia;
while(getline(plik,linia))
   {
      if(aktualny_nr==nr_linii) tresc=linia;
      if(aktualny_nr==nr_linii+1) a=linia;
      if(aktualny_nr==nr_linii+2) b=linia;
      if(aktualny_nr==nr_linii+3) c=linia;
      if(aktualny_nr==nr_linii+4) d=linia;
      if(aktualny_nr==nr_linii+5) poprawna=linia;
      aktualny_nr++;
   }

   plik.close();

Skąd program wie , którą aktualnie linie pobiera ? Rozumiem , że warunkiem sprawdza numer aktualnej linii , jednak while(getline(plik,linia)) nie , ma jakby odwołania do tego która to linijka. Zawsze zmienne są równe linia.

2 odpowiedzi

0 głosów
odpowiedź 10 kwietnia 2019 przez program naczelny Gaduła (3,320 p.)
Prosto mówiąc: dopóki getline(plik, linia) zwróca wartość true wykonuj dane czynności;
Dokładnie nie wiem, musiałbyś zajrzeć do dokumentacji, natomiast funkcja ta zwraca true jeżeli w pliku są jeszcze jakieś (zapełnione) linie które może pobrać.

EDIT: Nie musi wiedzieć którą pobiera
komentarz 10 kwietnia 2019 przez cyrus33 Użytkownik (680 p.)
Czyli while(getline(plik,linia)) wykona się tyle razy ile jest linijek w pliku ?

Dajmy na to jest 12 linii to pętla wykona się 12 razy , a aktualny numer zwiększa powtórzenia tylko dlatego żeby sprawdzić która raz się powtórzyło ? A jeżeli powtórzyło się 2 razy to w tym przypadku przypisze aktualną zmienną A . Dobrze to rozumiem ?
komentarz 10 kwietnia 2019 przez Shimeo7 Obywatel (1,910 p.)

Koledze chodziło o to skąd program wie, od której linijki ma sprawdzać. Druga sprawa, jeżeli ktoś rozpoczyna przygodę z panem Zelentem (być może błędne założenie, ale wnioskuje to po złożoności zadania) to chyba nie jest najlepszym pomysłem odsyłanie do dokumentacji, aczkolwiek jeżeli dalej będzie chciał programować to i tak go to czeka. Niemniej jednak na początku uważam, że to kiepski pomysł. Moim subiektywnym zdaniem, w celu wytłumaczenia takiemu adeptowi o co chodzi, należy krok po kroku wytłumaczyć dane zagadnienie w najmniej skomplikowany sposób.

komentarz 10 kwietnia 2019 przez program naczelny Gaduła (3,320 p.)

@cyrus33, dokładnie tak

komentarz 10 kwietnia 2019 przez j23 Mędrzec (194,920 p.)

natomiast funkcja ta zwraca true jeżeli w pliku są jeszcze jakieś (zapełnione) linie które może pobrać.

Nie, funkcja ta zwraca referencję do strumienia, który dostaje w pierwszym parametrze. Strumień std::istream ma zdefiniowany operator konwersji do void*, który zwróci wartość null (logiczne false), jeśli strumień wejdzie w stan fail. A wejdzie w stan fail, gdy std::getline nic nie przeczyta, ergo - skończy się plik.

0 głosów
odpowiedź 10 kwietnia 2019 przez Shimeo7 Obywatel (1,910 p.)
getline(plik,linia)

Ten fragment zwraca true, bądź false. True wtedy, kiedy linia nie składa się tylko i wyłącznie z pustych znaków. Dokument składa się z wierszy numerowanych od 1(tak jest domyślnie w przypadku odczytywania z plików tekstowych, ale mogę się mylić, dlatego, jeżeli tak jest to proszę mnie poprawić), a nie od 0, jak to w programowaniu jest. Gdzieś wcześniej musiał być określony start, w sensie, od którego wiersza ,,jedziemy". Domyślam się, że gdzieś w programie jest zmienna całkowita, w tym przypadku jest to aktualny_nr, musiała do niej zostać przypisana wartość 1 (czyli to jest nasz start) przed pętlą while. A dalej to z górki wczytujemy wiersz z dokumentu z linijki 1 i inkrementujemy aktualny_nr, itd., aż otrzymamy false.

Dla łatwiejszego zrozumienia może pobrać lekki edytor tekstowy NotePad, tam wiersze są numerowane (to nie jest żadna reklama ;) ). Następnie w tym edytorze otwórz dokument tekstowy i po lewej stronie masz numery poszczególnych wierszy.

komentarz 10 kwietnia 2019 przez j23 Mędrzec (194,920 p.)

True wtedy, kiedy linia nie składa się tylko i wyłącznie z pustych znaków.

Co to są puste znaki? Linia może mieć zero znaków, a std::getline "zwróci" true.

Podobne pytania

0 głosów
1 odpowiedź 909 wizyt
0 głosów
1 odpowiedź 275 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez Marcin Rutkowski Nowicjusz (140 p.)
0 głosów
1 odpowiedź 17,316 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...