C++ read() returns 未格式化的二进制数据
C++ read() returns unformatted binary data
我有一个从文件中读取内容的示例文件。内容是不可读的格式,如下所示。当我使用 read() 函数并计算变量时,它 returns 相同的二进制数据而不是显示普通文本。如何以人类可读的格式阅读内容?
这是文件的内容(在使用 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();
}
}
问题是您对对象的内部表示一无所知,因为它们的内部结构对您是隐藏的(称为 "data hiding")所以您不知道会发生什么如果您将它们的二进制内容转储到文件中,就会发生这种情况。
你写了二进制文件,你正在输入二进制文件。
特别是 std::string
NOT 包含实际的字符串,这就是它没有被写入您的文件的原因。 std::string
仅包含指向存储在内存中其他位置的字符串的 指针 。
最重要的是,除非您控制并理解正在写入的对象的内容,否则不要进行二进制输出。
最好将所有内容都转换为文本,然后reading/writing。
所以不要使用 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]
时,它工作得很好。
我有一个从文件中读取内容的示例文件。内容是不可读的格式,如下所示。当我使用 read() 函数并计算变量时,它 returns 相同的二进制数据而不是显示普通文本。如何以人类可读的格式阅读内容?
这是文件的内容(在使用 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();
}
}
问题是您对对象的内部表示一无所知,因为它们的内部结构对您是隐藏的(称为 "data hiding")所以您不知道会发生什么如果您将它们的二进制内容转储到文件中,就会发生这种情况。
你写了二进制文件,你正在输入二进制文件。
特别是 std::string
NOT 包含实际的字符串,这就是它没有被写入您的文件的原因。 std::string
仅包含指向存储在内存中其他位置的字符串的 指针 。
最重要的是,除非您控制并理解正在写入的对象的内容,否则不要进行二进制输出。
最好将所有内容都转换为文本,然后reading/writing。
所以不要使用 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]
时,它工作得很好。