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 overflowRox, 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.