2010-02-17 3 views
10

J'utilise Linux et C++. J'ai un fichier binaire avec une taille de 210732 octets, mais la taille rapportée avec seekg/tellg est 210728.C++: obtention d'une taille de fichier incorrecte

Je reçois les informations suivantes de ls-la, à savoir 210732 octets:

-RW rw-r-- 1 PJS PJS 210732 17 février 10h25 output.osr

Et avec l'extrait de code suivant, je reçois 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; 

donc, mon code est désactivé par 4 octets . J'ai confirmé que la taille du fichier est correcte avec un éditeur hexadécimal. Alors pourquoi je ne reçois pas la bonne taille?

Ma réponse: Je pense que le problème a été causé par la présence de plusieurs fstreams ouverts dans le fichier. Au moins, cela semble l'avoir réglé pour moi. Merci à tous ceux qui ont aidé.

+0

Est-ce le cas dans tous les systèmes de fichiers (en cas vous en avez plusieurs)? – hlovdal

+0

Malheureusement, je n'ai pas l'option de tester sur un autre système de fichiers. – PSJ

+0

Fonctionne bien sur mon système Ubuntu 32 bits. Utilisez-vous g ++? – tur1ng

Répondre

3

Au moins pour moi avec G ++ 4.1 et 4.4 sur CentOS 5 64 bits, le code ci-dessous fonctionne comme prévu, c'est-à-dire que la durée d'impression du programme est la même que celle renvoyée par l'appel 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

Merci. Étonnamment, cela me donne la bonne réponse. Je ne comprends pas pourquoi, mais cela me donne le résultat que je recherche. – PSJ

+0

mais c'est exactement le même code - en dehors de la distribution statique à int non signé – pm100

+0

Oui, je dois avoir quelque chose quelque part, qui interfère. J'essaie de comprendre. – PSJ

9

Pourquoi ouvrez-vous le fichier et vérifiez sa taille? La façon la plus simple est de le faire quelque chose comme ceci:

 
#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: MerciPSJ pour remarquer un pépin typo mineur ... :)

+0

J'ai remarqué que cela a été downvoted puis upvoted? – t0mm13b

+1

Probablement parce qu'il ne répond pas à la question –

+0

@Neil: Oh ... Il a parlé d'ouvrir le fichier et de chercher à la fin afin d'obtenir la taille et il a retourné des résultats incorrects ... Je me demandais pourquoi ne pas utiliser cette fonction au lieu d'avoir à ouvrir/fermer le fichier ...? – t0mm13b

1

Est-il possible que ls-est en fait rapport, le nombre d'octets du fichier prend sur le disque, au lieu de sa taille réelle? Cela expliquerait pourquoi il est légèrement plus élevé.

+0

C'était aussi ma pensée. Je génère le fichier moi-même et je mets 210732 octets dans le fichier, aussi quand j'inspecte le fichier avec ghex2 il contient réellement tous les octets. – PSJ

2

Quand une saveur d'Unix, pourquoi utilisons-nous que lorsque nous avons le utlilty stat

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

sinon,

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); 
} 
Questions connexes