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: #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; }
|
|
alixir |
» 2014-04-25 10:00:11 Zostawiasz znak nowej linii w strumieniu. Zapisz to np. tak: ( cin >> nr_domu ).get(); ( cin >> nr_mieszkania ).get(); ... ( cin >> telefon ).get(); |
|
kenzol Temat założony przez niniejszego użytkownika |
Działa » 2014-04-25 10:07:22 Faktycznie teraz działa:-) Takie proste... |
|
Monika90 |
» 2014-04-25 11:56:11 A co jak użytkownik napisze numer mieszkania, spację i dopiero potem enter? |
|
alixir |
» 2014-04-25 12:34:09 Oczywiście masz rację, ale jak napisałem W takim przypadku lepiej czyścić całość strumienia #include <limits> .. std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); |
|
pekfos |
» 2014-04-25 12:42:17 ( cin >> nr_domu ).get();
|
A co jeśli użytkownik poda zbyt wiele znaków? |
|
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: #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; }
|
|
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: #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. |
|
« 1 » |