2010-01-28 46 views
0

我將文件的內容分配到字符串對象中。爲了簡單起見,該文件只有5個字節,其大小爲1個整數加上另一個字節。 我想要做的是獲取字符串對象的前四個字節,並以某種方式將它存儲到程序有效的整數變量中。然後程序會對整數進行各種操作,改變它。 之後,我想將更改的整數存儲回字符串對象的前四個字節。讀取/寫入字符串對象上的整數值

誰能告訴我我可以做到這一點?我寧願堅持使用標準C++庫專門用於此目的。預先感謝您的幫助。

+0

那是功課嗎? – sbi 2010-01-28 20:17:20

+0

我甚至沒有參加過編程課。感謝與問題相關的所有答覆。 – kaykun 2010-01-28 20:20:18

+1

哦,我剛剛看到這個:你的意思是整數存儲_binary_?那麼我的回答是無稽之談。我會刪除它。 – sbi 2010-01-28 20:25:38

回答

2

下面的代碼片段應該說明一些事情。謹防endian差異。玩它。嘗試瞭解發生了什麼。添加一些文件操作(二進制讀取&寫入)。真正理解如何做到這一點的唯一方法是嘗試並創建一些測試。


#include <iostream> 
#include <string> 

using namespace std; 

int main(int argc, char *argv[]) { 
    int a = 108554107; // some random number for example sake 

    char c[4];   // simulate std::string containing a binary int 
    *((int *) &c[0]) = a; // use casting to copy the data 

    // reassemble a into b, using indexed bytes from c 
    int b = 0; 
    b |= (c[3] & 0xff) << 24; 
    b |= (c[2] & 0xff) << 16; 
    b |= (c[1] & 0xff) << 8; 
    b |= c[0] & 0xff; 

    // show that all three are equivalent 
    cout << "a: " << a << " b: " << b 
     << " c: " << *((int *) &c[0]) << endl; 

    return 0; 
} 
+0

非常感謝。 *((int *)&c)正在按照我希望它將char序列轉換爲整數的方式工作。 – kaykun 2010-01-28 22:18:08

+0

請注意,將任何內存地址轉換爲較大的類型可能會導致cpu對齊錯誤。在x86處理器上可以,因爲它們允許你這樣做,但幾乎所有其他處理器都會產生對齊錯誤。如果你希望你的代碼是跨平臺的,你可以使用memcpy而不是*(int *)。例如int i; memcpy(&i,c,sizeof(i)); – 2010-01-28 22:46:55

+0

感謝您的信息,我只是把它與memcpy一起工作。我從現在開始使用它。 – kaykun 2010-01-29 02:33:23

0

如果您從該文件讀入std::string,則任何零字節都將表示字符串結束,因此您最終可能會得到一個比5字節短的字符串。看看here如何做二進制I/O與C++流。

+0

我可以驗證我正在使用的字符串對象與文件的大小是否正確,即使是零字節也是如此。在你關聯的網站上,關於讀取數據的部分,它使用myFile.read(buffer,100); myFile是一個ifstream對象,緩衝區是一個char數組。我想讀取前四個字節作爲一個普通的int變量,而不是一個字符數組。 – kaykun 2010-01-28 20:35:11

+0

進一步閱讀「讀取/寫入非字符數據」。只需讀入你的int,不用中間字符串。 – 2010-01-28 20:49:05