C++ read() 返回未格式化的二进制数据

C++ read() returns unformatted binary data

本文关键字:格式化 二进制 数据 返回 read C++      更新时间:2023-10-16

我有一个从文件中读取内容的示例文件。内容采用不可读的格式,如下所示。当我使用 read() 函数并 cout 变量时,它返回相同的二进制数据而不是显示普通文本。如何以人类可读的格式阅读内容?

以下是我正在阅读的文件的内容(使用 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 :" << "nn";
        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();
    }
}

问题是你对对象的内部表示一无所知,因为它们的内部对你来说是隐藏的(它被称为"数据隐藏"),所以你不知道如果你将它们的二进制内容转储到文件中会发生什么。

写了二进制,你正在得到二进制。

特别是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;
}

要将文本写入文件,只需以与写入文件相同的方式写入cout

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

问题是我试图将字符串写入二进制文件。当我在我的结构中使用char airplaneCode[6]时,它工作得很好。