Olen tehnyt koulun harjoitustyötä, mutta mikäli tekstitiedosto on tyhjä, ei pysty fscanf:llä ottamaan mitään talteen (yllätys yllätys) ja se johtaa ohjelman kaatumiseen. Joten onko mahdollista tarkistaa jotenkin onko tekstitiedosto tyhjä (ei tekstiä sisällä, mutta tiedosto olemassa? Kieli on ilmeisesti c++.
Olennaisinta on tarkistaa fscanf-funktion paluuarvo, joka kertoo, montako %-kohtaa saatiin luettua. Kun lukeminen on epäonnistunut, feof-funktiolla voi tarkistaa, loppuiko tiedosto. Muu syy fscanf:n epäonnistumiselle on esimerkiksi väärä formaatti: yritetään lukea vaikka kokonaislukua (%d) mutta tiedostossa onkin jotain muuta.
FILE* f; f = fopen("tiedosto.txt", "r"); if (!f) { printf("Tiedostoa ei voida avata, eli sitä ei ehkä ole.\n"); exit(1); } int a, b; if (fscanf(f, "%d %d", &a, &b) != 2) { printf("Jostain syystä ei saatu luettua kahta lukua.\n"); if (feof(f)) { printf("Tiedostokin loppui.\n"); } exit(2); }
zeropointx kirjoitti:
Kieli on ilmeisesti c++.
Etkö ole edes varma, mitä kieltä käytät, vai tarkoititko, että jollain tavalla olisi viestistäsi ilmeistä, että kieli on C++? Minusta ainakin olisi ilmeisempää, että kieli on C, kun kerran käytät C:n standardikirjastoa.
Ilmeisesti C++? Mitäköhän tehtävää teet josset tiedä mitä kieltä siinä käytetään..
bool tarkista(const char *tiedosto) { ifstream x(tiedosto); return x; }
No tuo Roxin ratkaisu nyt ei ainakaan ratkaise yhtään mitään. Siinähän selviää vain, saako tiedoston avattua. Siitä ei varmaan ollut epäselvyyttä.
Metabolix kirjoitti:
No tuo Roxin ratkaisu nyt ei ainakaan ratkaise yhtään mitään. Siinähän selviää vain, saako tiedoston avattua. Siitä ei varmaan ollut epäselvyyttä.
= Jos saa avattua = tiedosto on olemassa, jos taas ei = tiedosto ei ole olemassa?
Eikö ... ?
Rox kirjoitti:
= Jos saa avattua = tiedosto on olemassa, jos taas ei = tiedosto ei ole olemassa?
Eikö ... ?
Tiedosto voi tosin olla tyhjä, vaikka onkin olemassa...
Rox kirjoitti:
Jos saa avattua = tiedosto on olemassa, jos taas ei = tiedosto ei ole olemassa?
Tai käyttäjällä ei ole oikeutta avata tiedostoa vaikka se onkin olemassa.
So siinä tapauksessa boost varmaan on ihan toimiva ratkaisu.
#include <boost/filesystem.hpp> bool FileExist( const std::string& Name ) { return boost::filesystem::exists(Name); }//@stack overflow
Rox, mitä jos nyt lukisit, mitä edes kysyttiin? Otsikossa kysyttiin tiedoston loppumisesta ja viestissä tiedoston tyhjyydestä. Kukaan ei ole kysynyt, onko se olemassa.
Mjooh.., saattaa olla että takerruin tähän:
zeropointx kirjoitti:
...ei tekstiä sisällä, mutta tiedosto olemassa?
std::ifstream tiedosto("tiedosto.txt"); if(tiedosto.peek() == std::ifstream::traits_type::eof()) MessageBox(NULL, "Tiedosto on tyhjä!", "...", MB_OK);
Aihe on jo aika vanha, joten et voi enää vastata siihen.