2011-05-05 3 views
0

Regardez ce petit code, il ouvrir un ifstream:problème avec ifstream

std::ifstream _fcs; 

bool openFile(char* path) 
{ 
    istream::pos_type pos; 
    int tmp = 0; 

    _fcs.open(path, fstream::binary | fstream::in); 

    if(!_fcs.is_open()) 
     return false; 

    tmp = 0; 
    pos = 0x404; 

    _fcs.seekg(0x404); 
    pos = _fcs.tellg(); /// return zero 

    _fcs >> tmp; /// 
    _fcs.read((char*)&tmp, 4); 

    return true; 
} 

j'ai deux problèmes. Après seekg, tellg renvoie zéro et quand je lis des données, il lit à partir du début du fichier

  1. Opérateur >> semble ne fonctionne pas. toujours retourner zéro!

//// ---------------------------------------- --------
merci pour votre attention. J'ai trouvé une solution dingue, mais je suis confus! si j'appelle deux fois seekg, cela fonctionne, voir ce code:

bool openFile(char* path) 
{ 
    istream::pos_type pos; 
    int tmp; 
    bool fail; 

    _fcs.open(path, fstream::binary | fstream::in); 

    if(!_fcs.is_open()) 
     return false; 

    _fcs.seekg(0x402); 
    _fcs.seekg(0x402); /// When it comments, the tellg returns 0. am i crazy!? 

    fail = _fcs.fail(); 
    assert(!fail); 

    pos = _fcs.tellg(); /// return 0x402!!! 

    /// _fcs >> tmp; 
    _fcs.read((char*)&tmp, 4); 

    return true; 
} 

vraiment, ce qui est arrivé?
//// -------------------------------------------- ----

s'il vous plaît aidez-moi ...
merci à l'avance.

Répondre

0

En mode binaire, >> n'est pas supposé fonctionner, vous devez utiliser ostream :: write.

Votre fichier existe-t-il réellement et a-t-il une taille? si note, vous ne pouvez pas "déplacer" à un point arbitraire dans un fichier vide.

+0

oui, il existe. c'est un fichier binaire et aussi je l'ouvre avec un éditeur hexadécimal. Je veux lire ne pas écrire! :( – Mostafa

+0

désolé, mal lu.utiliser istream :: lire puis –

+0

je l'utilise, mais pourquoi le seekg ne change pas le pointeur get !!!! – Mostafa

2

Vérifiez l'erreur en utilisant _fcs.fail() après votre appel seekg pour vous assurer que vous n'avez pas spécifié de position de fichier invalide.

vérifier la taille utilisation

_fcs.seekg(0,ios::end); 
int length = _fcs.tellg(); 

Vous devez également utiliser .read() pour obtenir la valeur len, que votre fichier est binaire

+0

je l'ai fait, je modifie ma question, le revoir, s'il vous plaît .. – Mostafa

+0

@Mostafa Je ne sais pas pourquoi vous devez l'appeler deux fois Vous avez utilisé un nombre magique différent cette fois (0x402 vs 0x404), donc je ne sais pas où dans votre fichier qui vous mène. Vérifiez la taille du fichier et assurez-vous de ne pas dépasser cette taille Lorsque vous dites que cela fonctionne, voulez-vous dire que vous avez lu la valeur que vous recherchez ou simplement que vous avez déplacé le pointeur de fichier? – jonsca