C++ Academy · leksjon

Feilhåndtering og tilstand

Kontroller strømtilstanden

Leksjon 4 av 413 trinn

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, og ignore() forkaster ugyldige inndata
  • skill mellom normal eof() og reelle feil; exceptions() kan kaste unntak, og gcount() validerer binære lesinger

Neste kurs: generere tilfeldige tall med <random>.

Gratis å komme i gang

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

  1. Lese filer med ifstream
  2. Skrive filer med ofstream
  3. Binærfil-I/O
  4. Feilhåndtering og tilstand
← Tilbake til C++ Academy