C++ Academy · Oppitunti

Virheenkäsittely ja tila

Tarkista virran tila

Oppitunti 4/413 vaihetta

Virheenkäsittely ja tila on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Virran tilabitit

Jokainen virta seuraa tilaansa tilalippujen avulla:

  • goodbit: kaikki on kunnossa.
  • eofbit: tiedoston loppu on saavutettu.
  • failbit: looginen virhe, kuten väärä muoto.
  • badbit: vakava I/O-virhe.
#include <iostream>
#include <fstream>

int main() {
    std::ifstream in("missing_98765.txt");
    std::cout << std::boolalpha << "good: " << in.good() << '\n';
    return 0;
}

Virran testaaminen

Virta voidaan muuntaa bool-arvoksi: se on true, kun sitä voidaan käyttää. if (!in) havaitsee epäonnistumisen tiiviisti.

#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

Jokaiselle lipulle on kyselymetodinsa: good(), eof(), fail() ja 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;
}

Epäonnistunut luku

Kun >> ei pysty jäsentämään odotettua tyyppiä, se asettaa failbit-lipun ja jättää kohteen ennalleen.

#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;
}

Tilan tyhjentäminen

Kun virhelippu on asetettu, virta pysyy käyttökelvottomana, kunnes kutsutte clear()-funktiota sen nollaamiseksi.

#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;
}

Virheellisen syötteen ohittaminen

Kutsukaa clear()-funktion jälkeen ignore()-funktiota virheellisten merkkien hylkäämiseksi ennen uutta yritystä.

#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;
}

Tiedoston lopun ja virheen erottaminen

Kun lukusilmukka päättyy, tarkistakaa, päättyikö se normaalisti eof()-tilaan vai todelliseen bad()-virheeseen.

#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;
}

Tarkistaminen avaamisen jälkeen

Tarkistakaa virta aina heti tiedoston avaamisen jälkeen, jotta puuttuva tai lukukelvoton polku aiheuttaa virheen heti.

#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;
}

Poikkeusten ottaminen käyttöön

Voitte pyytää virtaa heittämään poikkeuksen virhetilanteissa exceptions()-funktion avulla, jolloin hiljaiset virheet muuttuvat käsiteltäviksi std::ios_base::failure-poikkeuksiksi.

#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;
}

Luettujen tavujen määrän tarkistaminen

Binaarisen read-kutsun jälkeen gcount() ilmoittaa tosiasiassa luettujen tavujen määrän, joten voitte havaita vajaat luvut.

#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;
}

Vankka lukusilmukka

Yhdistäkää tekniikat: testatkaa virtaa silmukan ehdossa ja erottakaa sen päätyttyä normaali loppuminen virheestä.

#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;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte virran tilan.

Kertaus

Olette oppineet virheiden käsittelyn virroissa:

  • tilaliput good/eof/fail/bad voidaan tarkistaa niiden metodeilla tai testaamalla virtaa bool-arvona
  • clear() nollaa tilan ja ignore() hylkää virheellisen syötteen
  • erottakaa normaali eof() todellisista virheistä; exceptions() voi heittää poikkeuksen ja gcount() tarkistaa binaaristen lukujen määrän

Seuraava kurssi: satunnaislukujen tuottaminen kirjastolla <random>.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Virheenkäsittely ja tila” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Virheenkäsittely ja tila”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Virheenkäsittely ja tila”?

Tarkista virran tila Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Virheenkäsittely ja tila”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Tiedostojen lukeminen ifstreamilla
  2. Tiedostojen kirjoittaminen ofstreamilla
  3. Binaaritiedostojen I/O
  4. Virheenkäsittely ja tila
← Takaisin: C++ Academy