C++ C++;使用ofstream写入二进制文件

C++ C++;使用ofstream写入二进制文件,c++,binary,ofstream,C++,Binary,Ofstream,对于我正在开发的小文件格式,我需要向文件输出519字节的头。我对整个流概念有点陌生。虽然我有一些阅读Truevision Targa文件头的经验。但是输出是我非常熟悉的 所以基本上,这是我的问题 我打开了ofstream的一个实例,我需要输出一个头,如下所示: typedef struct header { char version; // offset 0, length 1 short int width; // offset 1, length 2

对于我正在开发的小文件格式,我需要向文件输出519字节的头。我对整个流概念有点陌生。虽然我有一些阅读Truevision Targa文件头的经验。但是输出是我非常熟悉的

所以基本上,这是我的问题

我打开了ofstream的一个实例,我需要输出一个头,如下所示:

typedef struct header {
    char      version;   // offset 0, length 1
    short int width;     // offset 1, length 2
    short int height;    // offset 3, length 2
    short int pathlen;   // offset 5, length 2
    char      desc[512]; // offset 7, length 512
} fileHeader;
现在我需要在一个文件的前519字节中获取所有这些内容,其余内容会有所不同,我如何将这个头复制到我的文件中

我更希望使用ofstream类来实现这一点,但我也可以使用原始的C库。我已经做了两个小时了,但我还没有找到任何地方,尝试在谷歌上搜索也没有多大帮助。

std::ofstream&operator(std::ifstream&in,header&myheader){
std::ofstream& operator<<(std::ofstream& out, const header& myheader) {
    out.write((char*)&myheader.version, sizeof(myheader.version));
    out.write((char*)&myheader.width, sizeof(myheader.width));
    out.write((char*)&myheader.height, sizeof(myheader.height));
    out.write((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    out.write((char*)&myheader.desc, sizeof(myheader.desc));
    return out;
}
std::ifstream& operator>>(std::ifstream& in, header& myheader) {
    in.read((char*)&myheader.version, sizeof(myheader.version));
    in.read((char*)&myheader.width, sizeof(myheader.width));
    in.read((char*)&myheader.height, sizeof(myheader.height));
    in.read((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    in.read((char*)&myheader.desc, sizeof(myheader.desc));
    return in;
}

int main() {
    std::cout << fileHeader << '\n';
    std::cin >> fileHeader;
    return 0;
}
in.read((char*)&myheader.version,sizeof(myheader.version)); in.read((char*)&myheader.width,sizeof(myheader.width)); in.read((char*)&myheader.height,sizeof(myheader.height)); in.read((char*)&myheader.pathlen,sizeof(myheader.pathlen)); in.read((char*)&myheader.desc,sizeof(myheader.desc)); 返回; } int main(){ std::cout文件头; 返回0; }
既然你没有指针,那就相当容易了!(注意,这仅适用于窄流)
另一个用文本和动态内存/指针等显示内容的示例

class thing {
    std::string name;
    int height;
    friend std::ofstream& operator<<(std::ofstream& out, const thing & myheader);
    friend std::ifstream& operator>>(std::ifstream& in, thing & myheader);
public: 
    thing() {}
};

std::ofstream& operator<<(std::ofstream& out, const thing & myheader) {
    thing << name.size() << ' ';
    thing.write(&name[0], name.size()) << ' ' << height;
} 
std::ifstream& operator>>(std::ifstream& in, thing & myheader) {
    int size;
    in >> size;
    myheader.name.resize(size);
    in.read(&myheader.name[0], name.size());
    return in >> myheader.height;        
} 
类的东西{
std::字符串名;
内部高度;
friend std::of Stream&operator(std::ifstream&in,thing&myheader);
公众:
事物(){}
};
std::ofstream和操作员myheader.height;
} 

如果结构的格式不正确,则该强制转换可能会导致问题。虽然我很感激您的回答,但我想解释一下这是如何工作的。如何确保数据以正确的顺序写入(版本优先,而不是宽度等)。而且,不知何故,这个函数在我看来并不正确。感觉有点不对劲。你们(两个)都对,我忘了填充。您的结构在RAM中不是519字节,只是在磁盘上。(在windows上为520字节)已修复@user1019020:它们本来是有序的,但是版本字节之后会有一个无意义的字节。如果您担心打包和单词对齐,建议您对结构的每个成员调用read和write,而不是一次性调用整个过程。从偏移量来看,似乎您希望将数据紧密打包。您的字符很可能被填充到您的体系结构上的短int边界。@MooingDuck是的,我尝试了您的方法,然后将文件读回,宽度突然从20变为5192或其他什么。我来试试你的新建议