2016-04-28 54 views
0

我有一個示例文件,它從文件中讀取內容。內容的格式不可讀,如下所示。當我使用read()函數和變量cout時,它將返回相同的二進制數據,而不是顯示普通文本。如何以人性可讀的格式讀取內容?C++ read()返回無格式的二進制數據

以下是文件的內容(根據使用write()函數)我讀:​​

LÀ ³ L¹ R

這裏是閱讀代碼:

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(); 
} 

這裏是代碼寫入數據:

#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

對不起,但我不確定你期望在這裏看到什麼,你能再解釋一下嗎? – vu1p3n0x

+5

令我驚訝的是,當您讀取一個文件並打印剛纔讀取的數據時,它會打印文件的內容。 – immibis

+0

使用'inputFile.gcount()'來確定從文件中讀取了多少字節。 – dreamlax

回答

0

的問題在於我試圖向二進制文件寫入字符串。當我在結構中使用char airplaneCode[6]時,它完美運行。

3

問題是你k現在什麼都沒有關於對象的內部表示,因爲它們的內部對你來說是隱藏的(它被稱爲「數據隱藏」),所以你不知道如果將它們的二進制內容轉儲到文件會發生什麼。

你寫二進制出來,你在得到二進制。

特別是std::string確實包含實際的字符串這就是爲什麼它不獲取寫入文件。 std::string僅包含指針到存儲在其他地方的字符串。

底線,除非您控制和理解正在寫入的對象的內容,否則不要執行二進制輸出。

你最好將所有東西都轉換成文本和讀/寫。

因此,而不是使用read()write()使用operator>>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

要寫入文本文件時,只寫它,你會寫cout以同樣的方式:

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