2016-04-28 6 views
0

Ich habe eine Beispieldatei, die Inhalte aus einer Datei liest. Der Inhalt ist in einem unlesbaren Format wie unten gezeigt. Wenn ich die read() - Funktion verwende und die Variable cout, gibt es die gleichen binären Daten zurück, anstatt normalen Text anzuzeigen. Wie lese ich die Inhalte in einem für Menschen lesbaren Format?C++ lesen() gibt unformatierte Binärdaten zurück

Hier sind die Inhalte der Datei (auf den Schreib() -Funktion) lese ich gerade:

LÀ ³ L¹ R

Hier ist der Lesecode:

void readBinary(){ 
    ifstream inputFile("flights.dat", ios::in | ios::binary); 

    char buffer[100]; 

    inputFile.seekg(0, ios::beg); 

    if(inputFile.is_open()){ 

     inputFile.read((char *)&buffer, sizeof(buffer)); 

     for(int i = 0; i < sizeof(buffer); i++){ 
      cout << buffer[i]; 
     } 

    } 
    inputFile.close(); 
} 

Hier ist die Code zum Schreiben der Daten:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 

using namespace std; 

void inputData(); 

struct airplaneDetails { 

    string airplaneCode; 
    int totalRows, seatsInRows, firstSeats, businessSeats, economySeats; 

}; 

int main(){ 

    inputData(); 

    return 0; 
} 

void inputData(){ 

    ofstream outputFile("flights.dat", ios::out | ios::binary | ios::app); 

    if(!outputFile.is_open()){ 
     cout << "There was an error opening the file."; 
    } else { 

     airplaneDetails airplane; 

     cout << "Please provide the details below :" << "\n\n"; 

     cout << "Enter the airplane code : "; 
     cin >> airplane.airplaneCode; 

     . 
     . 
     //Assigning values to the variables 
     . 
     . 

     //Put the pointer at the end 
     outputFile.seekp(0, ios::end); 

     //Write the input data to the binary file 
     outputFile.write((char *)&airplane.airplaneCode, sizeof(airplane.airplaneCode)); 
     outputFile.write((char *)&airplane.totalRows, sizeof(airplane.totalRows)); 
     outputFile.write((char *)&airplane.seatsInRows, sizeof(airplane.seatsInRows)); 
     outputFile.write((char *)&airplane.firstSeats, sizeof(airplane.firstSeats)); 
     outputFile.write((char *)&airplane.businessSeats, sizeof(airplane.businessSeats)); 
     outputFile.write((char *)&airplane.economySeats, sizeof(airplane.economySeats)); 

     //Close the file handler 
     outputFile.close(); 
    } 
} 
+3

Entschuldigung, aber ich bin mir nicht sicher, was Sie erwarten, hier zu sehen, könnten Sie etwas weiter erklären? – vu1p3n0x

+5

Es überrascht mich, dass Sie überrascht sind, wenn Sie eine Datei lesen und die Daten, die Sie gerade gelesen haben, drucken, den Inhalt der Datei. – immibis

+0

Verwenden Sie 'inputFile.gcount()', um genau zu bestimmen, wie viele Bytes aus der Datei gelesen wurden. – dreamlax

Antwort

0

Die Problem war, dass ich versuchte, eine Zeichenfolge in die Binärdatei zu schreiben. Als ich char airplaneCode[6] in meiner Struktur verwendete, funktionierte es tadellos.

3

Das Problem ist Sie k jetzt nichts über die interne Darstellung von Objekten, weil ihre Interna vor Ihnen verborgen ist (es heißt "Daten versteckt"), so dass Sie keine Ahnung haben, was passieren wird, wenn Sie ihre binären Inhalte in eine Datei ablegen.

Sie schrieben binäre und Sie bekommen binär in.

Insbesondere die std::string tut NICHT die tatsächliche Zeichenfolge enthalten, die, warum es auf Ihre Datei nicht geschrieben zu werden. Die std::string enthält lediglich einen Zeiger auf die Zeichenfolge, die an anderer Stelle im Speicher gespeichert ist.

Bottom line, mache keine binäre Ausgabe, es sei denn, du kontrollierst und verstehst den Inhalt der Objekte, die geschrieben werden.

Sie konvertieren besser alles in Text und lesen/schreiben das.

So anstatt read() und write() Verwendung operator>> und operator<<

bool output_details(const airplaneDetails& ad) 
{ 
    std::ofstream ofs("flights.dat"); // text mode 

    ofs << ad.airplaneCode << '\n'; 
    ofs << ad.totalRows << '\n'; 
    ofs << ad.seatsInRows << '\n'; 
    ofs << ad.firstSeats << '\n'; 
    ofs << ad.businessSeats << '\n'; 
    ofs << ad.economySeats << '\n'; 

    if(!ofs) 
     return false;  

    return true; 
} 

bool input_details(airplaneDetails& ad) 
{ 
    std::ifstream ifs("flights.dat"); // text mode 

    ifs >> ad.airplaneCode; 
    ifs >> ad.totalRows; 
    ifs >> ad.seatsInRows; 
    ifs >> ad.firstSeats; 
    ifs >> ad.businessSeats; 
    ifs >> ad.economySeats; 

    if(!ifs) 
     return false;  

    return true; 
} 
0

Um Text in eine Datei zu schreiben, schreiben Sie einfach es auf die gleiche Weise zu cout schreiben würde:

outputFile << airplane.airplaneCode << endl; 
outputFile << airplane.totalRows << endl; 
// and so on