De ce cin nu mai citește după o intrare invalidă
Recunoaște eșecul unei citiri numerice și diferențiază resetarea stării fluxului de eliminarea caracterelor greșite rămase la intrare.
În acest material
Dacă încerci să citești un număr întreg, dar următoarea intrare este un cuvânt, operația poate eșua. Fluxul memorează o stare de eroare, iar citirile următoare nu reiau automat procesul ca și cum nimic nu s-ar fi întâmplat.
Verifică operația de citire
O citire trebuie tratată ca o operație care poate reuși sau eșua. Într-un program interactiv, verificarea rezultatului îți permite să afișezi un mesaj și să ceri o altă valoare. Într-o problemă cu intrare garantată validă, contractul poate permite o implementare mai simplă.
Nu folosi mai departe o variabilă presupunând că noua valoare a fost citită, fără să verifici rezultatul atunci când datele pot fi invalide. O valoare afișată după eșec nu reprezintă dovada că operația a reușit.
Starea fluxului și caracterele sunt lucruri diferite
clear() resetează indicatoarele de stare ale fluxului. Nu elimină automat textul greșit rămas la intrare. Dacă încerci imediat aceeași citire numerică peste aceleași caractere, poți obține același eșec.
Pentru o interfață care acceptă un număr pe linie, o strategie este resetarea stării și ignorarea restului liniei până la caracterul de sfârșit de linie. Această strategie trebuie să corespundă formatului: într-un fișier cu mai multe câmpuri pe linie, ar putea arunca și date utile.
La o citire numerică din abc, fluxul intră în stare de eșec. clear resetează starea, dar nu consumă automat caracterele abc rămase la intrare.Mărește schema ↗
Sfârșitul fișierului nu este o greșeală de tastare
Dacă nu mai există date, nu are sens să repeți la infinit cererea pe același flux închis. Separă sfârșitul intrării de o valoare invalidă care poate fi înlocuită. O buclă de recuperare trebuie să aibă o condiție reală de oprire.
Mai există și valori numerice în afara intervalului tipului destinație. Aspectul format numai din cifre nu garantează că numărul încape într-un int. Alege tipul după limite și verifică starea citirii când sursa nu oferă garanții.
Testează traseul erorii
Introdu un număr valid, apoi un cuvânt, apoi alt număr valid. Verifică dacă programul recuperează exact cât ai stabilit prin contract. Testează separat terminarea intrării: programul trebuie să se oprească, nu să consume resurse repetând aceeași citire imposibilă.
Revezi intrarea și ieșirea, fișierele text și citirea liniilor.
Întrebări frecvente
Ce înseamnă failbit la citirea cu cin?
Este o stare de eroare a fluxului, de exemplu când extragerea unui număr nu poate interpreta intrarea. Citirile următoare nu reiau automat funcționarea normală cât timp starea nu este tratată.
Este suficient cin.clear pentru a corecta o intrare invalidă?
Nu întotdeauna. clear resetează starea, dar caracterele problematice pot rămâne în flux. Pentru o nouă încercare trebuie și consumată intrarea invalidă conform formatului ales.
Cum verific dacă citirea unui număr a reușit?
Folosește rezultatul operației de extragere drept condiție, de exemplu if (cin >> x). Prelucrează valoarea numai pe ramura de succes și stabilește separat comportamentul la eroare sau sfârșit de intrare.