2011-10-28 43 views
1

对于我正在开发的小文件格式,我需要将519字节的标头输出到文件。我对整个流概念有点新鲜。尽管我有一些阅读Truevision Targa文件头的经验。但输出是我很熟悉的东西。C++写入带有数据流的二进制文件

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

我打开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库也很好。我现在已经呆了2个小时了,而且我还没有到任何地方,并且尝试在Google上搜索也没有多大帮助。

回答

3
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; 
} 

既然你没有指针,那就相当简单! (注窄流这只作品)
另一个例子来说明一些文本,和动态内存/指针/等

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;   
} 
+0

以为蒙上如果结构的格式不正确可能会导致麻烦。 – Pubby

+0

虽然我很欣赏你的答案,但我想解释一下这是如何工作的。我怎样才能确保数据以正确的顺序写入(版本第一,宽度等)。另外,不知何故,这个功能并不适合我。一些感觉。 –

+0

你(都)是对的,我忘了填充。你的结构在RAM中不会是519字节,只是在磁盘上。 (在Windows上它将是520字节)固定。 @ user1019020:它们将按顺序排列,但版本字节后面会出现无意义的字节。 –