मुझे लगता है कि आप वास्तव में इनपुट अंतिम उत्पादन के साथ साथ लाइन में होना चाहता हूँ। थोड़ा अधिक मुश्किल है पहले, उदा मूल्य पढ़ सकते हैं और फिर इसे प्रिंट .:
std::cout << "how old are you? ";
std::cin >> x;
std::cout << "I am " << x << " years old\n";
इनपुट जो उत्पादन के साथ कतार में है के साथ काम: अन्यथा, समाधान तुच्छ है। यहां मुद्दा यह है कि कंसोल हैंडलिंग वास्तव में सिस्टम द्वारा की जाती है, न कि भाषा द्वारा। नतीजतन, डेटा दर्ज करते समय एक नई लाइन के लिए इंतजार करना आवश्यक है। कंसोल द्वारा नई लाइन को संभाला जाएगा और एक लाइन ब्रेक बनाया जाएगा। इस व्यवहार को अक्षम करने के लिए कंसोल व्यवहार पर निर्भर रहने के लिए काम करना आवश्यक है। ऐसा करने का कोई मानक सी ++ तरीका नहीं है।
मुझे नहीं पता कि विंडोज़ पर कंसोल नियंत्रण से कैसे निपटें: मैं मुख्य रूप से यूनिक्स प्रोग्रामर हूं। यूनिक्स सिस्टम पर आप इनपुट मोड को गैर-कैनोलिक (यानी ICANON
बिट साफ़ करने के लिए) सेट करने के लिए tcgetattr()
और tcsetattr()
का उपयोग करेंगे। आवश्यक फ़ाइल डिस्क्रिप्टर मानक इनपुट के लिए बस एक है, यानी, 0
।
एक बार कंसोल गैर-कैननिकल मोड का उपयोग कर रहा है, तो सभी महत्वपूर्ण प्रेस तुरंत एप्लिकेशन पर अग्रेषित की जाती हैं और कोई स्क्रीन इको नहीं किया जाता है। नतीजतन, रीडिंग फ़ंक्शन को वास्तव में अलग-अलग वर्णों को प्रतिबिंबित करने की आवश्यकता होगी और उसके बाद आगे एक पार्सिंग फ़ंक्शन पर जाना होगा। ऐसा करने का सबसे आसान तरीका फ़िल्टरिंग स्ट्रीम बफर बनाना है जो चरित्र को अग्रेषित करते समय std::cin
से std::cout
के लिए आवश्यक प्रतिध्वनि करता है। हालांकि, उन सभी को एक साथ काम करना थोड़ा सा काम है ...
डेमो पकाने पर मैंने देखा कि मुझे प्रतिध्वनि से निपटने के लिए भी आवश्यक है (जब उपयोगकर्ता एंटर कुंजी का उपयोग करता है तो एक नई लाइन से बचने के लिए)। कंसोल झंडे को रीसेट करना भी महत्वपूर्ण है क्योंकि उनमें से कुछ प्रोग्राम समाप्त होने के बाद भी वास्तव में बदलते रहते हैं।बिट्स साथ रखते समय एक कार्यान्वयन, लेकिन अभी भी कमी त्रुटि हैंडलिंग ऐसा दिखाई दे सकता:
#include <iostream>
#include <ctype.h>
#include <termios.h>
struct non_canon_buf
: std::streambuf {
char buffer;
non_canon_buf() {
termios flags = {};
tcgetattr(0, &flags);
flags.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &flags);
}
~non_canon_buf() {
termios flags = {};
tcgetattr(0, &flags);
flags.c_lflag |= ICANON | ECHO;
tcsetattr(0, TCSANOW, &flags);
}
int underflow() {
if (std::cin.get(buffer)) {
this->setg(&buffer, &buffer, &buffer + 1);
if (!std::isspace(static_cast<unsigned char>(buffer))) {
std::cout << buffer << std::flush;
}
return std::char_traits<char>::to_int_type(buffer);
}
return std::char_traits<char>::eof();
}
};
int main()
{
non_canon_buf sbuf;
std::istream in(&sbuf);
std::cout << "I am ";
int age = 0;
in >> age;
std::cout << " years old\n";
if (!in) {
std::cout << "ERROR: failed to enter a valid age!\n";
}
}
स्रोत
2015-12-14 23:42:13
की तरह कर सकते हैं यह मेरे लिए बहुत मतलब नहीं है। क्या आपको पहले * उपयोगकर्ता को आयु इनपुट करने के लिए नहीं कहना चाहिए और फिर 'std :: cout << "मैं हूं" << x << "वर्ष पुराना। \ N" 'पूरी तरह से? – 5gon12eder
तो क्या आप किसी रिक्त स्थान के साथ आने की कोशिश कर रहे हैं जिसमें उपयोगकर्ता अपनी उम्र इनपुट कर सकता है? यदि ऐसा है, दुर्भाग्यवश, ऐसा नहीं है कि टेक्स्ट-आधारित सिस्टम आम तौर पर कैसे काम करते हैं, लेकिन मुझे यकीन है कि यह [ncurses] (https://en.wikipedia.org/wiki/Ncurses) के साथ किया जा सकता है, हालांकि यह और अधिक हो जाएगा उलझा हुआ। – Numeri
किसी नई लाइन के बिना कुछ इनपुट करने का तरीका स्ट्रीम पर बफरिंग बंद करना है। लेकिन यह इस बात पर निर्भर करता है कि आप किस ओएस का उपयोग कर रहे हैं और सी ++ का हिस्सा नहीं है। उदाहरण के लिए विंडोज़ में आप स्क्रीन पर उन्हें प्रतिबिंबित किए बिना अक्षर प्राप्त कर सकते हैं और फिर बाद में तय कर सकते हैं कि स्क्रीन पर कौन से लोग डालेंगे। –