Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcja cin.getline()

Ostatnio zmodyfikowano 2014-04-27 12:23
Autor Wiadomość
kenzol
Temat założony przez niniejszego użytkownika
Funkcja cin.getline()
» 2014-04-25 09:48:03
Napisałem kod wczytujący dane z klawiatury i zapisujący je do pliku. Program pyta o dane adresowe i o numer telefonu. Nie wiem dlaczego, ale pojawia się problem, kiedy chcę wpisać kod pocztowy. Wtedy pojawia się na konsoli jednocześnie zapytanie o kod pocztowy i telefon i to co tam wtedy wpiszę, w pliku zewnętrznym przypisze się do nr telefonu, a kod pocztowy pozostanie pusty. Oto mój kod:

C/C++
#include <iostream>
#include <fstream>

using namespace std;

int telefon, nr_domu, nr_mieszkania;
const short rozmiar = 31, kod = 7;
char imie[ rozmiar ], nazwisko[ rozmiar ], ulica[ rozmiar ], kod_pocztowy[ kod ];

int main()
{
    cout << "Imie: ";
    cin.getline( imie, rozmiar );
    cout << "Nazwisko: ";
    cin.getline( nazwisko, rozmiar );
    cout << "Ulica: ";
    cin.getline( ulica, rozmiar );
    cout << "Nr domu: "; cin >> nr_domu;
    cout << "Nr mieszkania: "; cin >> nr_mieszkania;
    cout << "Kod pocztowy: ";
    cin.getline( kod_pocztowy, kod );
    cout << "Telefon: "; cin >> telefon;
   
    fstream notatnik;
    notatnik.open( "dane.txt", ios::out | ios::app );
   
    notatnik << "Imie: " << imie << endl;
    notatnik << "Nazwisko " << nazwisko << endl;
    notatnik << "Ulica: " << ulica << endl;
    notatnik << "Nr domu: " << nr_domu << endl;
    notatnik << "Nr mieszkania: " << nr_mieszkania << endl;
    notatnik << "Kod pocztowy: " << kod_pocztowy << endl;
    notatnik << "Nr telefonu: " << telefon << endl;
   
    notatnik.close();
   
    return 0;
}
P-108634
alixir
» 2014-04-25 10:00:11
Zostawiasz znak nowej linii w strumieniu.
Zapisz to np. tak:

C/C++
( cin >> nr_domu ).get();
( cin >> nr_mieszkania ).get();
...
( cin >> telefon ).get();
P-108637
kenzol
Temat założony przez niniejszego użytkownika
Działa
» 2014-04-25 10:07:22
Faktycznie teraz działa:-) Takie proste...
P-108638
Monika90
» 2014-04-25 11:56:11
A co jak użytkownik napisze numer mieszkania, spację i dopiero potem enter?
P-108644
alixir
» 2014-04-25 12:34:09
Oczywiście masz rację, ale jak napisałem
Zapisz to np. tak:

W takim przypadku lepiej czyścić całość strumienia
C/C++
#include <limits>
..
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
P-108646
pekfos
» 2014-04-25 12:42:17
C/C++
( cin >> nr_domu ).get();
A co jeśli użytkownik poda zbyt wiele znaków?
P-108647
kenzol
Temat założony przez niniejszego użytkownika
» 2014-04-27 10:44:27
A co jeśli użytkownik poda zbyt wiele znaków?

Dobre pytanie, a takie zabezpieczenie jeszcze bardziej udoskonaliłoby kod.
Przy mojej nauce z plikami tekstowymi natrafiłem na jeszcze jeden problem. Otóż chcę wpisywać dane do quizu i zapisywać je w pliku. Całą procedurę wpisywania zapętliłem funkcją "for" w nieskończoność, czyli konsola zamknie się dopiero gdy ja zamknę okno. Jednak pojawia się problem przy pierwszym powtórzeniu procedury. Otóż w jednej linii pojawia się polecenie wpisania treści pytania oraz jednocześnie odpowiedzi "A". Skutkiem czego do pliku zapisze się tylko treść odpowiedzi "A", a pytanie już nie. Wklejam kod:

C/C++
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char odpowiedz;
    const short rozmiar = 60;
    char pytanie[ rozmiar ], odp_A[ rozmiar ], odp_B[ rozmiar ], odp_C[ rozmiar ];
    for(;; )
    {
        cout << "pytanie: ";
        cin.getline( pytanie, rozmiar );
        cout << "A: ";
        cin.getline( odp_A, rozmiar );
        cout << "B: ";
        cin.getline( odp_B, rozmiar );
        cout << "C: ";
        cin.getline( odp_C, rozmiar );
        cout << "prawidlowa odpowiedz: ";
        cin >> odpowiedz;
       
        fstream plik;
        plik.open( "pytania_do_quizu.txt", ios::out | ios::app );
        plik << pytanie << endl;
        plik << odp_A << endl;
        plik << odp_B << endl;
        plik << odp_C << endl;
        plik << odpowiedz;
       
        plik.close();
    }
    return 0;
}
P-108788
kenzol
Temat założony przez niniejszego użytkownika
» 2014-04-27 12:23:06
Już znalazłem odpowiedź. Wszystko jest ok jeśli program będzie wyglądał tak:

C/C++
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char odpowiedz;
    const short rozmiar = 60;
    char pytanie[ rozmiar ], odp_A[ rozmiar ], odp_B[ rozmiar ], odp_C[ rozmiar ];
   
    cout << "pytanie: ";
    cin.getline( pytanie, rozmiar );
    cout << "A: ";
    cin.getline( odp_A, rozmiar );
    cout << "B: ";
    cin.getline( odp_B, rozmiar );
    cout << "C: ";
    cin.getline( odp_C, rozmiar );
    cout << "prawidlowa odpowiedz: ";
    cin >> odpowiedz;
    cout << endl;
   
    for(;; )
    {
        cout << "pytanie: ";
        cin.getline( pytanie, rozmiar );
        ( cin >> pytanie ).get();
        cout << "A: ";
        cin.getline( odp_A, rozmiar );
        cout << "B: ";
        cin.getline( odp_B, rozmiar );
        cout << "C: ";
        cin.getline( odp_C, rozmiar );
        cout << "prawidlowa odpowiedz: ";
        cin >> odpowiedz;
        cout << endl;
       
        fstream plik;
        plik.open( "pytania_do_quizu.txt", ios::out | ios::app );
        plik << pytanie << endl;
        plik << odp_A << endl;
        plik << odp_B << endl;
        plik << odp_C << endl;
        plik << odpowiedz;
       
        plik.close();
    }
    return 0;
   
}

Jeszcze prosiłbym o pomoc przy napisaniu warunku do pierwszego programu w tym poście. Tzn. o zabezpieczenie przed wpisaniem zbyt dużej liczby przy numerze domu. Żeby wyskoczył komunikat z informacją o zbyt dużej liczbie, a potem żeby można było wpisać nr domu jeszcze raz, dopóki liczba będzie poprawna.
P-108793
« 1 »
  Strona 1 z 1