| 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 » |