问题 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 字节,则在读取时它将被无偿删除。也以二进制模式打开输入文件。