Zabezpieczenie przed czytaniem pustego pliku

0

Otwieram plik:
fstream in(aaa.txt,ios::in | ios::out);
chce z niego wczytywac stringi az sie nie skonczy, uzywam petli:

while(! in.eof())
{
... tu wczytywanie...
}

Caly problem w tym ze jesli plik jest pusty lub nowoutworzony (tez pusty :-) ) to petla i tak wykona przebieg i wczyta smieci.

Jak temu zaradzic?

0

sprawdzic rozmiar pliku

0

Jak mam to zrobic? Jest do tego jakas funkcja czy co?

1

W sumie imho metody sa dwie.. z tym ze a) nie wiem pod jaki OS to chcesz (to sie wiaze z zapisem pierwszej metody) b) nie mam zielonego pojecia jak za pomoca streamow druga zapisac.. moze nie trzeba, moze jest jakas funkcja do tego...

w kazdym badz razie:
a) szukasz pliku w katalogu i sprawdzasz ile zajmuje (findfirst, findnext etc)

b) (jezeli nie ma na to funkcji) idziesz na koniec pliku jakims poleceniem seek, sprawdzasz offset, wracasz na poczatek... kozystajac z f* zapisal bym to tak:
curr = ftell( file );
fseek( file, 0, SEEK_END );
size = ftell( file );
fseek( file, curr, SEEK_SET );

c) (metoda nie na sprawdzenie wielkosci pliku).. kozystajac znowu z f* sprawdzil bym co zwraca funkcja odczytujaca (ktora zazwyczaj zwraca ile bajtow czy czego tam odczytal)

f = fopen( "asdf", "r" );
while( fread( buffer, 1, sizeof( buffer ), f ) != 0 ) {
costam
}

pokoj, Gynv

0

Dzieki za odpowiedzi. Moze mi jeszcze ktos powiedziec dlaczego ta petla z pierwszego posta nie przerywa sie od razu tylko wykonuje jedna iteracje?

0

Dlatego, że metoda eof zwraca 1 dopiero po nastąpieniu czytania poza obszarem pliku, nie sprawdza połozenia wskaźnika pozycji w pliku.

// pobrać długośc pliku mozna tez tak:

FILE* f=fopen(...);
long l=filelength(fileno(f));
  • filelength - io.h * fileno/_fileno - stdlib.h

// napisz to tak:

int e;
do{
  // ... tu wczytywanie...
  if(e=(!in.eof())){
    // ... tu ewentualna obrobka danych
  }
}while(e);
0

Ok, juz zrobilem:

baza.seekg(0,ios::end);
if(baza.tellg())
{
while(!baza.eof())
{czytanie}
}
else cout<<"Plik pusty!";

Dzieki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1