2012-05-10 28 views
2

這是該方案;C++ COUT uncasted存儲器(無效)

// I have created a buffer 
void *buffer = operator new(100) 

/* later some data from a different buffer is put into the buffer at this pointer 
by a function in an external header so I don't know what it's putting in there */ 

cout << buffer; 

我想打印出在這個指針放在緩衝區中看到了什麼數據。我想只是把它打印出來作爲原料ASCII,我知道會有一些非打印那裏的人物,但我也知道一些清晰的文字被推到了那裏。

從我在網上看了cout上不能打印出uncasted數據像void,而不是一個intchar。但是,編譯器不會讓我在飛行中使用(char)進行飛行。我應該創建一個單獨的變量,將指針的值轉換爲cout該變量,或者有什麼辦法可以直接保存另一個變量?

+1

任何理由不創建緩衝區爲char *如果這是你存儲在它是什麼?字符*幾乎是普遍的爲void *,你至少可以打印出來 –

+0

@EdHeal LMAO TRULY – johnathon

+0

@MartinBeckett因爲調用的外部函數需要void * – jwbensley

回答

1

這樣做:

char* buffer = new char[100]; 

std::cout << buffer; 
// at some point 
delete[] buffer; 

void*你只需要在某些情況下,主要是爲了與I2C接口互操作,但是這絕對不是要求void*,基本上失去所有類型信息的情況。

+2

如果'buffer'沒有空終止怎麼辦? –

+0

然後你有一個問題:) –

+0

不是,你可以將緩衝區視爲一個字符數組並使用'copy' +'ostream_iterator'或其他東西。 –

1

你需要將其轉換爲char*reinterpret_cast<char*>(buffer)。問題是void*代表什麼,所以只有th指針被打印;當你將它轉換爲char*,內存中的內容被解釋爲一個C風格的字符串

注:使用reinterpret_cast<>代替C風格的(char *),使你的意圖明確,避免微妙和硬-TO-發現錯誤後

注:當然,你可能會得到一個段錯誤,而不是,因爲如果數據的確不是不可能訪問

更新緩衝區相關的C風格的字符串,內存:您可以分配內存到char*緩衝區開始,它也可以解決你的問題:你仍然可以打電話給你的第三方功能(char*是impl icitly轉換爲void*,這我相信是第三方函數的參數類型),你不需要做演員-ING在所有。最好的辦法是爲零時的內存,並限制第三方功能,超過99個* sizeof(char)字節複製到緩衝區保存結束'\0' C風格的字符串結束

+0

啊我看到,C++風格static_casting是? – jwbensley

+0

如果你可以一起避免'void *',那麼爲什麼從'void *'中拋出它。 –

+0

它不是靜態轉換(稱爲'static_cast <>',但告訴編譯器您想以完全不同的方式重新解釋數據(並可能遭受後果) – Attila

6

做這樣的事情:

// C++11 
std::array<char,100> buf; 
// use std::vector<char> for a large or dynamic buffer size 

// buf.data() will return a raw pointer suitable for functions 
// expecting a void* or char* 
// buf.size() returns the size of the buffer 

for (char c : buf) 
    std::cout << (isprint(c) ? c : '.'); 

// C++98 
std::vector<char> buf(100); 

// The expression `buf.empty() ? NULL : &buf[0]` 
// evaluates to a pointer suitable for functions expecting void* or char* 

// The following struct needs to have external linkage 
struct print_transform { 
    char operator() (char c) { return isprint(c) ? c : '.'; } 
}; 

std::transform(buf.begin(), buf.end(), 
       std::ostream_iterator<char>(std::cout, ""), 
       print_transform()); 
1

如果您想通過字節去字節你可以使用一個unsigned char和遍歷它。

unsigned char* currByte = new unsigned char[100]; 
for(int i = 0; i < 100; ++i) 
{ 
    printf("| %02X |", currByte[i]); 
} 

這不是一個非常現代的(甚至非常「C++」)答案,但它會將它打印爲十六進制值。

+0

AFAIK,這只是C.在這段代碼中沒有C++的任何地方,即使演員是C風格演員:P –

+0

是的,它是'C'(新增加了新的一邊)。很好,很簡單,並且重點。:)刪除了演員,以免有人想知道Tony在做什麼。 – Dennis