2016-07-15 30 views
1

Kann mir jemand helfen zu überprüfen, wo ich falsch gemacht habe? Oder warum erklären? Ich bin ein Anfänger und habe versucht, die Binärdatei zu öffnen. Aber es läuft einfach "Datei ist offen" "0". Nichts kam heraus. Das Ziel: Das Programm Count3s öffnet eine Binärdatei, die 32-Bit-Ganzzahlen (Inte) enthält. Ihr Programm zählt die Anzahl der Vorkommen des Wertes 3 in dieser Datei von Zahlen. Ihr Ziel ist es, etwas über das Öffnen und Zugreifen auf Dateien zu lernen und Ihr Wissen über Kontrollstrukturen anzuwenden. Der Name der Datei, die Daten enthält, die vom Programm verwendet werden, lautet "treeData.bin".Wie öffne und lese ich eine Binärdatei in C++ mit einer bestimmten Bin-Datei?

mein Code wie unten, bitte helfen Sie mir, wenn Sie es wissen. Vielen Dank im Voraus!

#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

Sie haben nur Code zum Öffnen der Datei. Sie haben keine Codezeilen zum Lesen der Daten. –

+0

Sie möchten vielleicht z. [diese 'openmode'-Referenz] (http://en.cppreference.com/w/cpp/io/ios_base/openmode), die besagt, dass" ate "" das Ende des Streams unmittelbar nach dem Öffnen sucht ". –

Antwort

1

allererst Sie aus einer Datei geöffnet im Binär-Modus

mit

myfile.read (buffer,length); 

wo buffer sollte definiert werden als

int data; 

und als

myfile.read (&data,sizeof(int)); 
lesen sollten Das zweite wichtige Punkt liest aus der Datei für mehr als eine Zahl - Sie benötigen eine Schleife, die von der Bedingung, dass Stream prüfen gesteuert wird. Zum Beispiel:

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

Und das letzte, was, sollten Sie Datei schließen, dass erfolgreich oppened wurde, nachdem Sie das Lesen beendet:

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

Und einige additinal Tipps:

1) int ist nicht immer 32-Bit-Typ, also in Betracht ziehen int32_t von <cstdint>; und wenn Ihre Daten mehr als 1 Byte haben, ist die Byte-Reihenfolge wichtig, wurde aber in der Aufgabenbeschreibung nicht erwähnt

2) read ermöglicht das Lesen von mehr als einem Datenobjekt pro Aufruf, aber in diesem Fall sollten Sie Lese zu Array anstelle von einer Variablen

3) Lese und versuche Beispiele aus references und anderen verfügbaren Ressourcen wie this.

+0

Oder besser, verwenden Sie 'unsigned char buffer [bufsiz];' und dekodieren Sie die Oktetts wie geeignet. –

+0

Wie immer gibt es unendlich viele Möglichkeiten, dieses nicht so schwierige Problem zu lösen. Nydia sollte von simple versuchen und dann auf fortgeschrittene C++ Programmierung gehen. – VolAnd

+0

[Warum wird iostream :: eof innerhalb einer Schleifenbedingung als falsch angesehen?] (Http://stackoverflow.com/q/5605125/14065) Sie sollten 'while (myfile.read (& data, sizeof (int))) {/* Read working * /} ' –