问题 reading/writing 到二进制文件
Problems reading/writing to binary file
我写了下面的代码来将结构向量保存到二进制文件中。问题是在读取所有写入数据之前读取停止。
将 reinterpret_cast<const char*>
更改为 (char*)
或 (const char*)
无助于或更改输出。
鉴于它确实读取了正确的数据编号,因此它读取的代码至少部分正确。
我有什么明显的遗漏吗?或者为什么这不起作用?
#include <iostream>
#include <fstream>
#include <vector>
struct Pixel {
long long data;
Pixel() {
data = 0;
}
Pixel(long long data) :
data(data)
{}
};
void saveToBin(std::vector<Pixel>* pixels) {
std::ofstream binFile;
binFile.open("test.bin", std::ios::binary);
if (!binFile.is_open()) {
perror("Error open");
exit(EXIT_FAILURE);
}
for (int i = 0; i < pixels->size(); i++) {
binFile.write(reinterpret_cast<const char*>(&pixels->at(i)),sizeof(Pixel));
}
binFile.close();
}
void readBin(std::vector<Pixel>* pixels) {
std::ifstream binFile;
binFile.open("test.bin", std::ifstream::in);
if (!binFile.is_open()) {
perror("Error open");
exit(EXIT_FAILURE);
}
Pixel p;
while (binFile.read(reinterpret_cast<char*>(&p), sizeof(Pixel))) {
pixels->push_back(p);
}
binFile.close();
}
int main()
{
std::vector<Pixel> vecOrig;
for (int i = 0; i < 1000; i++) {
vecOrig.push_back(Pixel(i*7));
}
std::vector<Pixel> vecRead;
saveToBin(&vecOrig);
readBin(&vecRead);
std::cout << "starting length : " << vecOrig.size() << " , read length : " << vecRead.size() << std::endl;
for (int i = 0; i < std::min(vecOrig.size(), vecRead.size()); i++) {
std::cout << vecOrig[i].data << " -> " << vecRead[i].data << std::endl;
}
}
binFile.open("test.bin", std::ios::binary);
输出文件以 binary
模式打开。
binFile.open("test.bin", std::ifstream::in);
输入文件不是。
这仅对追溯其血统至 MS-DOS 的操作系统很重要,如果您的二进制文件恰好有一个 0x0D
字节,则在读取时它将被无偿删除。也以二进制模式打开输入文件。
我写了下面的代码来将结构向量保存到二进制文件中。问题是在读取所有写入数据之前读取停止。
将 reinterpret_cast<const char*>
更改为 (char*)
或 (const char*)
无助于或更改输出。
鉴于它确实读取了正确的数据编号,因此它读取的代码至少部分正确。
我有什么明显的遗漏吗?或者为什么这不起作用?
#include <iostream>
#include <fstream>
#include <vector>
struct Pixel {
long long data;
Pixel() {
data = 0;
}
Pixel(long long data) :
data(data)
{}
};
void saveToBin(std::vector<Pixel>* pixels) {
std::ofstream binFile;
binFile.open("test.bin", std::ios::binary);
if (!binFile.is_open()) {
perror("Error open");
exit(EXIT_FAILURE);
}
for (int i = 0; i < pixels->size(); i++) {
binFile.write(reinterpret_cast<const char*>(&pixels->at(i)),sizeof(Pixel));
}
binFile.close();
}
void readBin(std::vector<Pixel>* pixels) {
std::ifstream binFile;
binFile.open("test.bin", std::ifstream::in);
if (!binFile.is_open()) {
perror("Error open");
exit(EXIT_FAILURE);
}
Pixel p;
while (binFile.read(reinterpret_cast<char*>(&p), sizeof(Pixel))) {
pixels->push_back(p);
}
binFile.close();
}
int main()
{
std::vector<Pixel> vecOrig;
for (int i = 0; i < 1000; i++) {
vecOrig.push_back(Pixel(i*7));
}
std::vector<Pixel> vecRead;
saveToBin(&vecOrig);
readBin(&vecRead);
std::cout << "starting length : " << vecOrig.size() << " , read length : " << vecRead.size() << std::endl;
for (int i = 0; i < std::min(vecOrig.size(), vecRead.size()); i++) {
std::cout << vecOrig[i].data << " -> " << vecRead[i].data << std::endl;
}
}
binFile.open("test.bin", std::ios::binary);
输出文件以 binary
模式打开。
binFile.open("test.bin", std::ifstream::in);
输入文件不是。
这仅对追溯其血统至 MS-DOS 的操作系统很重要,如果您的二进制文件恰好有一个 0x0D
字节,则在读取时它将被无偿删除。也以二进制模式打开输入文件。