2016-07-15 1 views
1

Est-ce que quelqu'un pourrait m'aider à vérifier où j'ai mal fait? Ou expliquer pourquoi? Je suis débutant et j'ai fait de mon mieux pour ouvrir le fichier binaire. Mais il ne reste plus que "fichier est ouvert" "0". Rien n'est sorti.comment ouvrir et lire un fichier binaire en C++ par un fichier bin donné?

L'objectif: Le programme Count3s ouvre un fichier binaire contenant des entiers de 32 bits (ints). Votre programme comptera le nombre d'occurrences de la valeur 3 dans ce fichier de nombres. Votre objectif est d'apprendre à ouvrir et accéder aux fichiers et d'appliquer vos connaissances des structures de contrôle. Le nom du fichier contenant les données utilisées par le programme est "threesData.bin".

mon code comme ci-dessous, s'il vous plaît aidez-moi si vous le savez. Merci d'avance!

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

int main() 
{ 
int count=0 ; 
ifstream myfile; 
myfile.open("threesData.bin", ios::in | ios :: binary | ios::ate); 

if (myfile) 
{ 
    cout << "file is open " << endl; 
    cout << count << endl; } 

else 
    cout << "cannot open it" << endl; 


return 0;  
} 
+3

Vous avez seulement le code pour ouvrir le fichier. Vous n'avez aucune ligne de code pour lire les données. –

+0

Vous voudrez peut-être lire par exemple. [cette référence 'openmode'] (http://en.cppreference.com/w/cpp/io/ios_base/openmode) qui dit que' ate' "cherche à la fin du flux immédiatement après l'ouverture". –

Répondre

1

d'abord tout ce que vous devez lire le fichier ouvert en mode binaire avec

myfile.read (buffer,length); 

buffer doit être défini comme

int data; 

et utilisé comme

myfile.read (&data,sizeof(int)); 

Le deuxième important Le point lit à partir du fichier pour plus d'un numéro - vous avez besoin d'une boucle qui est contrôlée par une condition qui vérifie le flux. Par exemple:

while (myfile.good() && !myfile.eof()) 
    { 
     // read data 
     // then check and count value 
    } 

Et la dernière chose, vous devez fermer le fichier, qui a été avec succès oppened, après avoir terminé la lecture:

myfile.open("threesData.bin", ios::binary); 
    if (myfile) 
    { 
     while (myfile.good() && !myfile.eof()) 
     { 
      // read data 
      // then check and count value 
     } 
     myfile.close(); 
     // output results 
    } 

Et quelques conseils additionnelles de:

1) int est pas toujours de type 32 bits, pensez à utiliser int32_t de <cstdint>; et si vos données ont plus de 1 octet, l'ordre des octets peut être important, mais il n'a pas été mentionné dans la description de la tâche

2) read permet de lire plus d'un objet de données par appel, mais dans ce cas vous devriez lire au tableau au lieu d'une variable

3) lire et essayer des exemples de references et d'autres ressources disponibles comme this.

+0

Ou mieux, utilisez 'unsigned char buffer [bufsiz];' et décoder les octets le cas échéant. –

+0

Comme toujours, il existe un nombre infini de façons de résoudre ce problème pas si difficile. Nydia devrait essayer à partir de simples et ensuite aller à la programmation vraiment C++ avancée. – VolAnd

+0

[Pourquoi iostream :: eof est-il dans une condition de boucle considérée comme incorrecte?] (Http://stackoverflow.com/q/5605125/14065) Vous devez utiliser 'while (monfichier.read (& data, sizeof (int))) {/* Read travaillé * /} ' –