2010-02-17 18 views
10

Używam systemu Linux i C++. Mam plik binarny o rozmiarze 210732 bajtów, ale rozmiar zgłaszano seekg/tellg jest 210728.C++: Pobieranie nieprawidłowego rozmiaru pliku

uzyskać następujące informacje od ls-la, tj 210732 bajtów:

-RW -RW-r-- 1 pjs pjs 210732 lut 17 10:25 output.osr

I z poniższym fragmencie kodu, otrzymuję 210728:

std::ifstream handle; 
handle.open("output.osr", std::ios::binary | std::ios::in); 
handle.seekg(0, std::ios::end); 
std::cout << "file size:" << static_cast<unsigned int>(handle.tellg()) << std::endl; 

Więc mój kod jest wyłączony przez 4 bajty . Potwierdziłem, że rozmiar pliku jest poprawny za pomocą edytora szesnastkowego. Dlaczego więc nie otrzymuję prawidłowego rozmiaru?

Moja odpowiedź: wydaje mi się, że przyczyną problemu było posiadanie wielu otwartych plików źródłowych do pliku. Przynajmniej wydaje mi się, że to załatwiło sprawę. Dziękuję wszystkim, którzy pomogli.

+0

Czy to przypadek we wszystkich systemach plików (w przypadku masz kilka)? – hlovdal

+0

Niestety, nie mam opcji testowania na innym systemie plików. – PSJ

+0

Działa dobrze na moim 32-bitowym systemie Ubuntu. Czy używasz g ++? – tur1ng

Odpowiedz

3

Przynajmniej dla mnie z G ++ 4.1 i 4.4 na 64-bitowym CentOS 5, poniższy kod działa zgodnie z oczekiwaniami, tj. Długość, jaką program drukuje, jest taka sama, jak długość zwracana przez wywołanie stat().


#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    int length; 

    ifstream is; 
    is.open ("test.txt", ios::binary | std::ios::in); 

    // get length of file: 
    is.seekg (0, ios::end); 
    length = is.tellg(); 
    is.seekg (0, ios::beg); 

    cout << "Length: " << length << "\nThe following should be zero: " 
     << is.tellg() << "\n"; 

    return 0; 
} 
+0

Dziękuję. Co zaskakujące, daje mi to właściwą odpowiedź. Nie rozumiem dlaczego, ale daje mi to wynik, którego szukam. – PSJ

+0

ale to jest dokładnie ten sam kod - poza statycznym rzutowaniem na unsigned int – pm100

+0

Tak, muszę coś gdzieś, to przeszkadza. Próbuję to rozgryźć. – PSJ

9

Dlaczego otwierasz plik i sprawdzasz rozmiar? Najłatwiej jest to zrobić coś takiego:

 
#include <sys/types.h> 
#include <sys/stat.h> 

off_t getFilesize(const char *path){ 
    struct stat fStat; 
    if (!stat(path, &fStat)) return fStat.st_size; 
    else perror("file Stat failed"); 
} 

Edit: Dzięki PSJ za wskazanie drobne usterki literówka ... :)

+0

Zauważyłem, że zostało to odrzucone, a następnie przegłosowane? Dlaczego? – t0mm13b

+1

Prawdopodobnie dlatego, że nie odpowiada na pytanie –

+0

@Neil: Oh ... Mówił o otwarciu pliku i poszukiwaniu do końca, aby uzyskać rozmiar i zwrócił nieprawidłowe wyniki ... Zastanawiałem się, dlaczego nie użyć tego zamiast tego musisz otworzyć/zamknąć plik ...? – t0mm13b

1

Czy jest możliwe, że ls -la faktycznie zgłasza liczbę bajtów, które plik zajmuje na dysku, zamiast jego rzeczywistego rozmiaru? To wyjaśniałoby, dlaczego jest ono nieco wyższe.

+0

To była też moja myśl. Generuję plik sam i wkładam 210732 bajtów do pliku, również gdy sprawdzam plik za pomocą ghex2, to faktycznie zawiera on wszystkie bajty. – PSJ

2

Kiedy na smaku Unix, dlaczego używamy, że gdy mamy utlilty stat

long findSize(const char *filename) 
{ 
    struct stat statbuf; 
    if (stat(filename, &statbuf) == 0) 
    { 
     return statbuf.st_size; 
    } 
    else 
    { 
     return 0; 
    } 
} 

jeśli nie,

long findSize(const char *filename) 
{ 
    long l,m; 
    ifstream file (filename, ios::in|ios::binary); 
    l = file.tellg(); 
    file.seekg (0, ios::end); 
    m = file.tellg(); 
    file.close(); 
    return (m – l); 
} 
Powiązane problemy