2011-08-01 91 views
4

我正在嘗試pwrite一些數據在一個文件的某個偏移量與給定的文件描述符。我的數據存儲在兩個向量中。一個包含unsigned long s和另一個包含char s。如何從無符號長整型轉換爲void *?

我想建立一個void *指向代表我unsigned long S和char S中的比特序列,並將其與累計大小一起傳遞給pwrite。但我怎樣才能投unsigned longvoid*? (我想我可以找出字符)。這裏是我想要做的事:

void writeBlock(int fd, int blockSize, unsigned long offset){ 
    void* buf = malloc(blockSize); 
    // here I should be trying to build buf out of vul and vc 
    // where vul and vc are my unsigned long and char vectors, respectively. 
    pwrite(fd, buf, blockSize, offset); 
    free(buf); 
} 

而且,如果你認爲我的上述思想不好,我會很樂意閱讀的建議。

回答

6

您無法將unsigned long轉換爲void *。前者是一個數字值;後者是未指定數據的地址。大多數系統將指針指定爲具有特殊類型的整數(包括您在日常工作中可能遇到的任何系統),但實際類型間的轉換被認爲是有害的。

如果你想要做的是寫一個unsigned int你的文件描述符的值,你應該使用&運營商採取的值的地址:通過

unsigned int *addressOfMyIntegerValue = &myIntegerValue; 
pwrite(fd, addressOfMyIntegerValue, sizeof(unsigned int), ...); 

您可以循環您矢量或數組,並將它們逐一寫入。或者,也可以更快地把它們寫CS使用std::vector的連續內存功能集體:

std::vector<unsigned int> myVector = ...; 
unsigned int *allMyIntegers = &myVector[0]; 
pwrite(fd, allMyIntegers, sizeof(unsigned int) * myVector.size(), ...); 
+0

凡真實downvoting答案會很好地解釋了爲什麼他們downvoting。 –

+0

-1s是怎麼回事? +1 – TravisG

+0

感謝您的回覆。對我來說唯一的問題是如何構建我的buf,因爲我需要一些unsinged的long和chars並且關心效率,所以我寧願構建我的buf,然後將它傳遞給pwrite以最大限度地減少I/O。 – Pirooz

2

它可以通過下面的代碼來投:

unsigned long my_long; 
pwrite(fd, (void*)&my_long, ...); 
3
unsigned long i; 
void* p = (void*)&i; 
0

像這樣:

std::vector<unsigned long> v1; 
std::vector<char>   v2; 

void * p1 = reinterpret_cast<void*>(&v1[0]); 
void * p2 = reinterpret_cast<void*>(&v2[0]); 

寫大小v1.size() * sizeof(unsigned long)v2.size()

相關問題