亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從常量內存創建輸入流

從常量內存創建輸入流

C++
墨色風雨 2019-10-31 13:02:22
我在const char*指針指向的緩沖區中有一些數據。數據只是一個ASCII字符串。我知道它的大小。我希望能夠以與從流讀取數據相同的方式讀取它。我正在尋找一種解決方案,允許我編寫如下代碼:// for example, data points to a string "42 3.14 blah"MemoryStreamWrapper in(data, data_size);int x;float y;std::string w;in >> x >> y >> w;重要條件:不得以任何方式復制或更改數據(否則,我將只使用字符串流。就我所知,如果不復制數據,就無法從const char指針創建字符串流。 )
查看完整描述

3 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

這樣做的方法是創建一個合適的流緩沖區。例如,可以這樣做:


#include <streambuf>

#include <istream>


struct membuf: std::streambuf {

    membuf(char const* base, size_t size) {

        char* p(const_cast<char*>(base));

        this->setg(p, p, p + size);

    }

};

struct imemstream: virtual membuf, std::istream {

    imemstream(char const* base, size_t size)

        : membuf(base, size)

        , std::istream(static_cast<std::streambuf*>(this)) {

    }

};

唯一有點尷尬的是const_cast<char*>()流緩沖區中的內容:流緩沖區不會更改數據,但仍需要char*使用該接口,主要是為了更輕松地更改“常規”流緩沖區中的緩沖區。這樣,您可以將其imemstream用作普通輸入流:


imemstream in(data, size);

in >> value;


查看完整回答
反對 回復 2019-10-31
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

唯一的方法是將std :: istream子類化(這也需要將std :: streambuf子類化)以創建自己的從常量內存讀取的流類。


這并不像聽起來那樣容易,因為C ++標準庫流類非?;靵y且設計不良。除非您需要大量擴展,否則我認為這不值得。


查看完整回答
反對 回復 2019-10-31
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

上周,我了解到我們目前的目標是C ++ 2014!也就是說,需要在4月份提交完整的建議書,準備將其提交工作文件-盡管這是一個很小且實際上有用的功能,但我認為這種情況不會發生。一個絆腳石是,每當為IOStreams提出任何建議時,都會有一個主要的抱怨:“我們能不能有更好的東西?” 但沒有人提出更好的建議……

查看完整回答
反對 回復 2019-10-31
  • 3 回答
  • 0 關注
  • 399 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號