Feilhåndtering og tilstand
Kontroller strømtilstanden
Feilhåndtering og tilstand er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Tilstandsflagg for strømmer
Alle strømmer registrerer tilstanden sin med tilstandsflagg:
- goodbit: alt er i orden.
- eofbit: slutten på filen er nådd.
- failbit: en logisk feil (feil format).
- badbit: en alvorlig I/U-feil.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("missing_98765.txt");
std::cout << std::boolalpha << "good: " << in.good() << '\n';
return 0;
}Teste en strøm
En strøm kan konverteres til bool: den er true når den kan brukes. if (!in) oppdager feil på en kortfattet måte.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("nope_55555.txt");
if (!in) std::cout << "stream not usable\n";
else std::cout << "ok\n";
return 0;
}good, eof, fail, bad
Hvert flagg har en metode for kontroll: good(), eof(), fail() og bad().
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("abc");
int x;
s >> x; // fails: not a number
std::cout << std::boolalpha;
std::cout << "fail: " << s.fail() << '\n';
std::cout << "bad: " << s.bad() << '\n';
return 0;
}Mislykket uttrekking
Når >> ikke kan analysere den forventede typen, settes failbit, og målet forblir uendret.
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("hello");
int n = -1;
if (!(s >> n)) std::cout << "could not read an int, n stays " << n << '\n';
return 0;
}Nullstille tilstanden
Når et feilflagg er satt, forblir strømmen ubrukelig til De kaller clear() for å nullstille det.
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("x 42");
int n;
s >> n; // fails on 'x'
s.clear(); // reset state
std::string word;
s >> word; // now reads 'x'
std::cout << "recovered: " << word << '\n';
return 0;
}Ignorere ugyldige inndata
Etter clear() kan De bruke ignore() til å forkaste de ugyldige tegnene før De prøver på nytt.
#include <iostream>
#include <sstream>
#include <limits>
int main() {
std::istringstream s("bad 100");
int n;
while (!(s >> n)) {
s.clear();
s.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
}
std::cout << "read " << n << '\n';
return 0;
}Skille EOF fra feil
Etter at en leseløkke er avsluttet, må De kontrollere om den ble avsluttet normalt med eof(), eller om det oppstod en reell feil med bad().
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("1 2 3");
int x;
while (s >> x) {}
std::cout << std::boolalpha << "reached eof: " << s.eof() << '\n';
std::cout << "hardware error: " << s.bad() << '\n';
return 0;
}Kontrollere etter åpning
Kontroller alltid strømmen rett etter at en fil er åpnet, slik at et manglende eller uleselig filnavn gir en feil så tidlig som mulig.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("absent_11111.txt");
if (!in.is_open()) {
std::cout << "open failed, aborting\n";
return 1;
}
std::cout << "never reached\n";
return 0;
}Aktivere unntak
De kan be en strøm om å kaste unntak ved feil med exceptions(), slik at stille feil blir til feil som kan fanges opp som std::ios_base::failure.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in;
in.exceptions(std::ios::failbit);
try {
in.open("ghost_22222.txt");
} catch (const std::exception& e) {
std::cout << "caught open failure\n";
}
return 0;
}Validere antall leste bytes
Etter en binær read oppgir gcount() hvor mange bytes som faktisk ble lest, slik at korte lesinger kan oppdages.
#include <iostream>
#include <fstream>
int main() {
int v = 9;
std::ofstream("g.bin", std::ios::binary).write(reinterpret_cast<const char*>(&v), sizeof(v));
int out;
std::ifstream in("g.bin", std::ios::binary);
in.read(reinterpret_cast<char*>(&out), sizeof(out));
std::cout << "read " << in.gcount() << " bytes\n";
return 0;
}En robust leseløkke
Kombiner teknikkene: test strømmen i løkken, og skill deretter mellom en normal avslutning og en feil.
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("5 10 15");
int total = 0, x;
while (s >> x) total += x;
if (s.eof()) std::cout << "sum = " << total << " (clean)\n";
else std::cout << "error during read\n";
return 0;
}Hurtigsjekk
Test forståelsen Deres av strømtilstand.
Oppsummering
De har lært om feilhåndtering for strømmer:
- tilstandsflaggene good/eof/fail/bad, som kan kontrolleres med metodene deres eller ved å teste strømmen som en bool
clear()nullstiller tilstanden, ogignore()forkaster ugyldige inndata- skill mellom normal
eof()og reelle feil;exceptions()kan kaste unntak, oggcount()validerer binære lesinger
Neste kurs: generere tilfeldige tall med <random>.
Lær deg C++ med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «Feilhåndtering og tilstand» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Feilhåndtering og tilstand», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Feilhåndtering og tilstand»?
Kontroller strømtilstanden Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C++ Academy?
Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Feilhåndtering og tilstand»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?
Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Lese filer med ifstream
- Skrive filer med ofstream
- Binærfil-I/O
- Feilhåndtering og tilstand