Write
में दो आवश्यक विधियां हैं: write
और flush
। चूंकि write
पहले से ही लिखा बाइट की संख्या देता है, तो आप सिर्फ ट्रैक है कि:
use std::io::{self, Write};
struct ByteCounter<W> {
inner: W,
count: usize,
}
impl<W> ByteCounter<W>
where W: Write
{
fn new(inner: W) -> Self {
ByteCounter {
inner: inner,
count: 0,
}
}
fn into_inner(self) -> W {
self.inner
}
fn bytes_written(&self) -> usize {
self.count
}
}
impl<W> Write for ByteCounter<W>
where W: Write
{
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let res = self.inner.write(buf);
if let Ok(size) = res {
self.count += size
}
res
}
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}
fn main() {
let out = std::io::stdout();
let mut out = ByteCounter::new(out);
writeln!(&mut out, "Hello, world! {}", 42).unwrap();
println!("Wrote {} bytes", out.bytes_written());
}
यह नहीं प्रतिनिधि write_all
या write_fmt
के लिए महत्वपूर्ण है, क्योंकि इन बाइट्स की गिनती नहीं लौटाते हैं। उन्हें प्रतिनिधि बनाना बाइट्स को लिखा जाना चाहिए और ट्रैक नहीं किया जाएगा।
यह एक उत्कृष्ट जवाब भी, दोनों के रूप में सही चिह्नित करने के लिए अच्छा होगा है! – ideasman42
@ ideasman42 यदि आप इसे उत्तर के रूप में चिह्नित करते हैं तो मुझे कोई फर्क नहीं पड़ता, क्योंकि यह भी लागू होता है यदि 'खोज' लागू नहीं किया गया है या नहीं किया जा सकता है। – wimh
@ विमह एह, मुझे पता नहीं। स्वीकार करना जो कुछ भी ओपी को उनके विशिष्ट मामले में सबसे ज्यादा मदद करता है। उपरोक्त उत्तर में आते हैं कि भविष्य के लोग उपयोगी पाते हैं। – Shepmaster