对于我正在开发的小文件格式,我需要向文件输出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库也很好。我已经在这里工作了2个小时,而且我还没到任何地方,试图在谷歌搜索也没有多大帮助。
答案 0 :(得分: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;
}