2011-10-28 73 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:它們將按順序排列,但版本字節後面會出現無意義的字節。 –