straem緩衝區其介面由class basic_treambuf<>定義。
c++對於檔案的操作是通過fstream建立檔案流來實現的,
它不支援檔案描述符,對於這個問題可以通過緩衝區重定向
封裝檔案描述符可以很好的解決,在linux中一切都是檔案,
同樣對其inux的裝置終端,socket等等都可以看成對檔案的操作
所以通過自定義緩衝區都可以像操作io流一樣實現對其他裝置的
操作,這確實很有魅力。 一、
使用者自定義output緩衝區
output緩衝區有散的pointer維護
1、pbase()是緩衝區的開始
2、pptr()是當前寫入的位置
3、epptr()是緩衝區結尾
自定義不帶緩衝功能的緩衝區只需要重寫overflow()函式,overflow()的作用是當緩衝區滿時將資料寫入,以為不帶緩衝
功能所以每傳送乙個字元就呼叫overflow()。
#include
#include
#include
class outbuf:public std::streambuf
} return c;}};
要想支援國際化即寬窄字元可以用模版實現上述類
#include
#include
//#include
#include
template>
class basic_outbuf:public std::basic_streambuf
}return traits::not_eof(c);}};
typedef basic_outbufoutbuf;
typedef basic_outbufwoutbuf;
int main()
protected:
virtual int_type overflow(int_type c)
}return c;
}virtual std::streamsize xsputn(const char* s,std::streamsize num)
};class fdostream:public std::ostream
};int main()
protected:
virtual int_type underflow()
std::memmove(buffer+(4-numputback),gptr()-numputback,
numputback);
int num;
num=read(fd,buffer+4,buffersize-4);
if(num<=0)
setg(buffer+(4-numputback),
buffer+4,
buffer+4+num);
return traits_type::to_int_type(*gptr());
}
};int main()
{int fd=open("b.txt",o_rdonly|o_wronly);
inbuf buffer(fd);
std::istream is(&buffer);
std::string s;
is>>s;
std::cout<
實在有太多的內容,相互聯絡,所以我建議看一下《c++標準程式庫》那裡一一做了詳細解釋,除此之外要想來靈活運用建議自己實現比如file,socket的封裝,建議看一下:
c 環形緩衝區
public class circularbuffer icollection,ienumerable,icollection,ienumerable public circularbuffer int capacity,bool allowoverflow public bool allowove...
c 輸出緩衝區重新整理
在c 中,io操作都是有io物件來實現的,每個io物件又管理乙個緩衝區,用於儲存程式讀寫的資料。只有緩衝區被重新整理的時候緩衝區中的內容才會寫入真實的檔案或輸出裝置上。那麼,什麼情況下會重新整理輸出緩衝區呢,有如下五種情況 1.程式正常結束。作為main返回工作的一部分,將清空所有的輸出緩衝區。2....
c 輸出緩衝區重新整理
在c 中,io操作都是有io物件來實現的,每個io物件又管理乙個緩衝區,用於儲存程式讀寫的資料。只有緩衝區被重新整理的時候緩衝區中的內容才會寫入真實的檔案或輸出裝置上。那麼,什麼情況下會重新整理輸出緩衝區呢,有如下五種情況 1.程式正常結束。作為main返回工作的一部分,將清空所有的輸出緩衝區。2....