2010-02-18 41 views
5

我想我可能不得不使用fstream對象,但我不知道如何。本質上,我想將文件讀入字節緩衝區,對其進行修改,然後將這些字節重寫爲文件。所以我只需要知道如何做字節I/O。從文件讀取和寫入字節(C++)

+2

你想以二進制方式打開它填滿。 – GManNickG 2010-02-18 02:33:04

+1

@GManNickG這個不能太強調。如果不這樣做,會導致你用隨機的錯誤將你的頭撞在牆上一個小時左右。 例如,如果你插入一個隨機的'cout << file_stream.tellg();'在某處並且否則失敗,代碼將起作用。 – Tibor 2012-08-09 14:49:33

回答

7
#include <fstream> 

ifstream fileBuffer("input file path", ios::in|ios::binary); 
ofstream outputBuffer("output file path", ios::out|ios::binary); 
char input[1024]; 
char output[1024]; 

if (fileBuffer.is_open()) 
{ 
    fileBuffer.seekg(0, ios::beg); 
    fileBuffer.getline(input, 1024); 
} 

// Modify output here. 

outputBuffer.write(output, sizeof(output)); 

outputBuffer.close(); 
fileBuffer.close(); 

從記憶我認爲這是怎麼回事。

+0

我通常會讓它們變成動態的,因爲我不會將它們全部放在一個函數裏liko – Craig 2010-02-18 02:41:53

+4

在使用new之後,您仍然需要刪除m_content。 C++沒有垃圾收集。 另外1024字節應該很容易放在堆棧上,所以只需使用'char m_content [1024];' – 2010-02-18 02:42:27

+0

^是的不要忘記:D。 – Craig 2010-02-18 02:43:35

0

在執行文件I/O時,您必須在循環中讀取文件,以檢查文件結尾和錯誤條件。您可以使用上面的代碼是這樣

while (fileBufferHere.good()) { 
    filebufferHere.getline(m_content, 1024) 
    /* Do your work */ 
} 
1

如果你正在處理的文件尺寸小,我建議在閱讀整個文件更容易。然後使用緩衝區並再次寫入整個塊。這些告訴你如何讀取塊 - 假設你在打開的輸入/輸出文件從上面的回覆

// open the file stream 
    ..... 
    // use seek to find the length, the you can create a buffer of that size 
    input.seekg (0, ios::end); 
    int length = input.tellg(); 
    input.seekg (0, ios::beg); 
    buffer = new char [length]; 
    input.read (buffer,length); 

    // do something with the buffer here 
    ............ 
    // write it back out, assuming you now have allocated a new buffer 
    output.write(newBuffer, sizeof(newBuffer)); 
    delete buffer; 
    delete newBuffer; 
    // close the file 
    .......... 
+0

或者應該改變緩衝區並將其寫回。 – 2010-02-19 00:40:39

+0

全部取決於修改類型。如果它只是在流中的一個或多個字節的一對一替換,會更容易。但是,如果更改添加更多字節,它可能會導致內存溢出異常 - 這是一個常見的錯誤。 – 2010-02-19 00:49:31