2015-06-25 9 views
7

मैं प्रत्येक पंक्तिक्या जंग के पास स्कैनफ की तरह कुछ भी है?

<string><space><int><space><float> 

उदा पर के साथ एक फ़ाइल को पार्स करने की जरूरत है

abce 2 2.5 

सी में मुझे क्या करना होगा:

scanf("%s%d%f", &s, &i, &f); 

मैं कैसे जंग में यह आसानी से और मुहावरे कर सकते हैं?

उत्तर

10

मानक पुस्तकालय नहीं करता है इस कार्यक्षमता प्रदान नहीं करते हैं। आप एक मैक्रो के साथ अपना खुद का लिख ​​सकते हैं।

macro_rules! scan { 
    ($string:expr, $sep:expr, $($x:ty),+) => {{ 
     let mut iter = $string.split($sep); 
     ($(iter.next().and_then(|word| word.parse::<$x>().ok()),)*) 
    }} 
} 

fn main() { 
    let output = scan!("2 false fox", char::is_whitespace, u8, bool, String); 
    println!("{:?}", output); // (Some(2), Some(false), Some("fox")) 
} 

मैक्रो से पीछे नहीं इनपुट तर्क एक & str, चार, या उचित बंद/समारोह हो सकता है। निर्दिष्ट प्रकारों को FromStr विशेषता लागू करना आवश्यक है।

ध्यान दें कि मैंने इसे एक साथ जल्दी रखा है ताकि इसे पूरी तरह से परीक्षण नहीं किया गया हो।

6

आपको लगता है कि वाक्य रचना में print! मैक्रो mimicks scanf की तरह इनपुट के लिए text_io टोकरा का उपयोग कर सकते

#[macro_use] extern crate text_io; 

fn main() { 
    // note that the whitespace between the {} is relevant 
    // placing any characters there will ignore them but require 
    // the input to have them 
    let (s, i, j): (String, i32, f32); 
    scan!("{} {} {}\n", s, i, j); 
} 

तुम भी 3 आदेश प्रत्येक में विभाजित कर सकते हैं:

#[macro_use] extern crate text_io; 

fn main() { 
    let a: String = read!("{} "); 
    let b: i32 = read!("{} "); 
    let c: f32 = read!("{}\n"); 
} 
+0

ऐसा प्रतीत होता है कि आपको अब 'सुविधा (प्लगइन)' की आवश्यकता नहीं है? – Shepmaster

+0

मैंने वर्तमान संस्करण में उदाहरण अपडेट किए हैं –

संबंधित मुद्दे