2011-10-06 33 views
9

मुझे प्रतीक-द्वारा-प्रतीक पढ़ने की आवश्यकता है। लेकिन मुझे नहीं पता कि इनपुट के अंत तक कैसे पढ़ा जाए। जैसा कि उदाहरण परीक्षण प्रणाली >> कुछ अनिवार्य एम बार होगा। मुझे सभी पात्रों के प्रतीक-प्रतीक को पढ़ना है। केवल एम बार। यह मेरे द्वारा कैसे हो सकता है?सी ++ सीन चार पढ़ा प्रतीक-द्वारा-प्रतीक

+0

इसे एक स्ट्रिंग में डालने का प्रयास करें। –

+0

क्या आप इनपुट के अंत तक पढ़ रहे हैं, * एम * बार, या आप * एम * प्रतीकों की मात्रा पढ़ रहे हैं? –

+0

या 'आईट्रीम :: get (char * buffer, size_t len, char delimiter)' और 'istream :: read (char * buffer, size_t len) 'में देखें, यदि आप व्हाइटस्पेस और न्यूलाइन सहित सभी बाइट्स चाहते हैं –

उत्तर

5

आप स्वरूपित इनपुट चरित्र-दर-चरित्र, ऐसा करने चाहते हैं std::istream & या इसी प्रकार की फ़ाइल, जैसे std::cin

+0

कच्चे बाइट्स (सिंबोस) पढ़ने के लिए, 'cin.read' विधि आमतौर पर अधिक कुशल होती है, कम से कम यह कम फ़ंक्शन कॉल का उपयोग करती है। –

+0

@ थॉमस मैथ्यूज: धन्यवाद, मैंने इसके बारे में भी सोचा - मैंने वैकल्पिक संस्करण भी जोड़ा। –

0

इस प्रयास करें:

#include <iostream> 
using std::cin; 
using std::cout; 

int main(int argc, char *argv[]) 
{ 
    char ch; 
    unsigned m = 10; 
    while (cin && m--) { 
     cin.read(&ch, sizeof(ch)); 
     cout << ch; 
    } 
    return 0; 
} 
+1

क्यों कास्ट एक 'char *' 'char *' के लिए? –

+0

यह समाधान * एम * प्रतीकों की मात्रा नहीं पढ़ता है या यह ईओएफ, * एम * बार तक पढ़ने दोहराता नहीं है। –

+0

@ थॉमस मैथ्यू फिक्स्ड। – Sergey

3

वहाँ एक समय में एक चरित्र को पढ़ने के लिए कई तरीके हैं जब तक आप उन सब को पढ़ा है, और उनमें से कोई जरूरी सबसे अच्छा है।

व्यक्तिगत रूप से, मैं निम्नलिखित कोड के साथ जाना चाहते हैं:

char c; 
while (cin.get(c)) { 
    // Process c here. 
} 

आप केवल, m वर्णों को पढ़ने के लिए एक for पाश उपयोग करने पर विचार करने की जरूरत है:

char c; 
for (unsigned int i = 0; i < m && cin.get(c); ++i) { 
    // Process c here. 
} 

इस लूप के रूप में लंबे समय तक चलता है क्योंकि दो स्थितियां पूरी होती हैं: (1) m से कम वर्ण पढ़े गए हैं, और (2) अभी भी पढ़ने के लिए वर्ण हैं।

हालांकि, दोनों समाधानों में कमी है: वे अपेक्षाकृत अक्षम हैं। एक बार में m वर्णों को पढ़ने के लिए यह अधिक कुशल है।

तो सबसे पहले m वर्ण स्टोर करने के लिए एक बड़ा पर्याप्त बफर आवंटित और फिर उन्हें पढ़ने के लिए प्रयास: अंतिम पंक्ति

std::vector<char> buffer(m); 
cin.read(&m[0], m); 
unsigned total_read = cin.gcount(); 

सूचना - इससे आपको पता होगा कि क्या m अक्षर वास्तव में पढ़ा जा सकता है।

char c; 
while (infile >> c) 
{ 
    // process character c 
} 

आप कच्चे बाइट्स पढ़ने के लिए चाहते हैं, तो ऐसा करते हैं::

char b; 
while (infile.get(b)) 
// while(infile.read(&b, 1) // alternative, compare and profile 
{ 
    // process byte b 
} 

या तो मामले में, infile होना चाहिए

+0

यह समाधान प्रतीकों की मात्रा को नहीं पढ़ता है या यह ईओएफ, एम बार तक पढ़ने को दोहराता नहीं है। –

+0

@ थॉमस अपडेट देखें। अद्यतन के लिए –

+0

+1, विशेष रूप से 'for' लूप में EOF केस को कवर करना। –

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