2010-03-06 13 views
31

Czy istnieje prosty sposób sprawdzenia, czy plik jest pusty. Na przykład, jeśli przekazujesz plik do funkcji i zdajesz sobie sprawę, że jest pusty, to zamykasz go od razu? Dzięki.Sprawdzanie pustego pliku w C++

Edytować, próbowałem za pomocą metody fseek, ale pojawia się komunikat "nie można przekonwertować do pliku FILE *".

parametr mojej funkcji jest

myFunction(ifstream &inFile) 
+0

Szkoda, że ​​nie można łatwo uzyskać deskryptora pliku z 'fstream'. Możesz z łatwością sprawdzić pusty plik używając 'fstat', na Unixie. :-P –

Odpowiedz

50

Może coś w rodzaju:

bool is_empty(std::ifstream& pFile) 
{ 
    return pFile.peek() == std::ifstream::traits_type::eof(); 
} 

Krótkie i słodkie.


Z obawy do Twojego błędu, pozostałe odpowiedzi używać C-stylu dostępu do plików, w których można uzyskać FILE* z określonych funkcji.

W przeciwieństwie do Ciebie i ja pracujemy ze strumieniami C++ i jako takie nie możemy ich używać. Powyższy kod działa w prosty sposób: peek() wyświetli strumień i wróci, bez usuwania, następną postacią. Jeśli dojdzie do końca pliku, zwraca eof(). Ergo, my po prostu peek() w strumieniu i zobaczmy, czy to jest eof(), ponieważ pusty plik nie ma nic do podglądania.

Uwaga: to również zwraca wartość true, jeśli plik nigdy nie został otwarty, co powinno działać w twoim przypadku. Jeśli nie chcesz, aby:

std::ifstream file("filename"); 

if (!file) 
{ 
    // file is not open 
} 

if (is_empty(file)) 
{ 
    // file is empty 
} 

// file is open and not empty 
+0

nie byłoby zbyt trudno dodać 'return pFile.tellg()> 0 || ... ' – Potatoswatter

+1

Co za odpowiedź ... – IssamTP

5

Szukajcie na końcu pliku i sprawdzić położenie:

fseek(fileDescriptor, 0, SEEK_END); 
if (ftell(fileDescriptor) == 0) { 
    // file is empty... 
} else { 
    // file is not empty, go back to the beginning: 
    fseek(fileDescriptor, 0, SEEK_SET); 
} 

Jeśli nie masz plik otwarty już, wystarczy użyć funkcji fstat i sprawdź bezpośrednio rozmiar pliku.

0
pFile = fopen("file", "r"); 
fseek (pFile, 0, SEEK_END); 
size=ftell (pFile); 
if (size) { 
    fseek(pFile, 0, SEEK_SET); 
    do something... 
} 

fclose(pFile) 
+1

sformatuj kod za pomocą przycisku paska narzędzi, który wygląda jak "100110" – t0mm13b

+0

Niezdarny kod. Niepolecane. – SmallChess

7

OK, więc ten fragment kodu powinien zadziałać. Zmieniłem nazwy, aby pasowały do ​​twojego parametru.

inFile.seekg(0, ios::end); 
if (inFile.tellg() == 0) {  
    // ...do something with empty file... 
} 
1
char ch; 
FILE *f = fopen("file.txt", "r"); 

if(fscanf(f,"%c",&ch)==EOF) 
{ 
    printf("File is Empty"); 
} 
fclose(f); 
+1

Dlaczego używałbyś tych idiomów C w C++? –

0

jak o (nie elegancki sposób, chociaż)

int main(int argc, char* argv[]) 
{ 
    std::ifstream file; 
    file.open("example.txt"); 

    bool isEmpty(true); 
    std::string line; 

    while(file >> line) 
     isEmpty = false; 

     std::cout << isEmpty << std::endl; 
} 
+1

Wystarczająco fair. Jest nieco lepszy (z powodu bycia _actual_ C++, nie C) niż user4471014, choć nadal jest całkowicie nieekonomiczny i nieoptymalny. –

+0

@LightnessRacesinOrbit, masz rację, jednak nie musisz przechodzić przez wszystkie wiersze pliku.Pętla while może zostać zatrzymana po wykryciu pierwszej linii i ustawieniu 'isEmpty' na 'false'. Jeśli to mogłoby ulepszyć kod. – CroCo

+0

Rozumiem, że ten kod jest nieoptymalny, ale dlaczego jest marnotrawny? OP nie pyta ani nie szuka wystarczającego lub zoptymalizowanego kodu. – CroCo

-1
if (nfile.eof()) // Prompt data from the Priming read: 
    nfile >> CODE >> QTY >> PRICE; 
else 
{ 
    /*used to check that the file is not empty*/ 
    ofile << "empty file!!" << endl; 
    return 1; 
} 
+1

Chociaż może to stanowić rozwiązanie problemu OP, nie ma żadnego wyjaśnienia kodu. –

1

użyj: data.peek() = „\ 0! "

Szukałem przez godzinę, aż do końca to pomogło!

+0

Jak to jest lepsze niż zaakceptowana odpowiedź? – Norrius