Kolejny dzień przerabiania kursu- kolejne problemy :)
Po lekturze rozdziału o ciągi znaków- łańcuchy zrodziły się we mnie pewne wątpliwości odnośnie samego strumienia cin lecz zanim o tym, to celem usystematyzowania informacji z kursu (proszę mnie poprawić w razie złej interpretacji):
1. get() oraz getline() są metodami strumienia cin i znajdują zastosowanie tylko do tablic- zmienna musi być tablicą.
2. metoda get() oraz getline() służą do wczytania całego wiersza znaków, włącznie ze znakami białymi.
3. metoda get() nie przechowuje znaku końca linii (ENTER) lecz go zwraca, w pierwszej kolejności natychmiast przy ponownym jej użyciu. Dlatego też w poniższym kodzie nie jest możliwe podanie swojego nazwiska (w pierwszej kolejności ładowany jest z pamięci strumienia cin znak "ENTER", który kończy zarazem wykonywanie strumienia cin, odpowiedzialnego za podanie nazwiska.
#include <iostream>
#include <conio.h>
int main()
{
using namespace std;
const short rozmiar = 50;
char ciag_znak[ rozmiar ];
char lancuch[ rozmiar ];
cout << "Podaj swoje 2 imiona ";
cin.get( ciag_znak, rozmiar );
cout << "Podaj swoje nazwisko ";
cin.get( lancuch, rozmiar );
cout << endl << endl;
cout << ciag_znak << endl;
cout << lancuch << endl;
return 0;
}
4. metoda getline() również zwraca (w pierwszej kolejności) z pamięci cin znak końca strony. Usuwa ona ponad to znak końca linii z podanego przed nią łańcucha znaków. Dlatego też w poniższym kodzie jest możliwe podanie swojego nazwiska.
#include <iostream>
#include <conio.h>
int main()
{
using namespace std;
const short rozmiar = 50;
char ciag_znak[ rozmiar ];
char lancuch[ rozmiar ];
cout << "Podaj swoje 2 imiona ";
cin.getline( ciag_znak, rozmiar );
cout << "Podaj swoje nazwisko ";
cin.getline( lancuch, rozmiar );
cout << endl << endl;
cout << ciag_znak << endl;
cout << lancuch << endl;
return 0;
}
Problem pojawia się przy analizie poniższego kodu:
#include <iostream>
#include <conio.h>
int main()
{
using namespace std;
const short rozmiar = 50;
char lancuch[ rozmiar ];
int rok;
cout << "W ktorym roku dostales komputer?"
<< endl;
cin >> rok;
cout << "Jak sie nazywala ulubiona gra?\n";
cin.getline( lancuch, rozmiar );
cout << "Komputer dostales w " << rok
<< " roku." << endl;
cout << "Ulubiona gra to " << lancuch
<< "." << endl;
getch();
return( 0 );
}
Wynika bowiem z tego, że strumień cin zapamiętuje znak końca linii natomiast go nie zwraca przy ponownym użyciu tegoż strumienia. Gdyby go zwracał to niemożliwe było by podanie nazwiska w poniższym przykładzie.
#include <iostream>
#include <conio.h>
int main()
{
using namespace std;
char a;
char b;
cout << "Podaj imie"
<< endl;
cin >> a;
cout << "Podaj nazwisko";
cin >> b;
cout << "Twoje imie to " << a << endl;
cout << "Twoje nazwisko to " << b << endl;
getch();
return( 0 );
}
Znak końca linii jest natomiast zwracany przez metodę get() lub getline(), gdy wystąpi ona po wcześniej wprowadzonym strumieniu cin.
cout << "W ktorym roku dostales komputer?"
<< endl;
cin >> rok;
cout << "Jak sie nazywala ulubiona gra?\n";
cin.getline( lancuch, rozmiar );
Wynika więc z tego ze get() nie zapamiętuje żadnego znaku końca lini, gdyż jest on zapamiętywany przez cin. Get() jak i getline() służą więc tylko do tego, żeby wczytać ciąg znaków z uwzględnieniem znaków białych (np. spacja), co jest nie możliwe przy zastosowaniu samego cin. Getline () ponad to usuwa z cin wprowadzony znak końca lini.
I tu się pojawia problem, bowiem jeżeli getline () usuwa znak końca lini ze strumienia cin to dlaczego w powyższym kodzie tego nie robi? Czy to dlatego, że w pierwszej kolejności getline() zwraca niesiony w pamięci cin znak końca strony a dopiero następnie usuwa ten znak ze strumienia stojącego za getline()?