আমি কীভাবে সি ++ এ সিন বাফারটি সাফ করব?
আমি কীভাবে সি ++ এ সিন বাফারটি সাফ করব?
উত্তর:
সম্ভবত:
std::cin.ignore(INT_MAX);
এটি পড়তে এবং যতক্ষণ না সমস্ত কিছু উপেক্ষা করবে EOF
। (আপনি দ্বিতীয় আর্গুমেন্টও সরবরাহ করতে পারেন যা পড়ার মতো চরিত্রটি (যেমন: '\n'
একটি লাইন উপেক্ষা করার জন্য))।
এছাড়াও: আপনি সম্ভবত একটি করতে চান: এর std::cin.clear();
আগেও স্ট্রিমের স্থিতি পুনরায় সেট করতে।
আমি সি সংস্করণগুলির তুলনায় সি ++ আকারের সীমাবদ্ধতাগুলি পছন্দ করব:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin
ফ্লাশ করতে উপরের প্রথম বিবৃতিটি ব্যবহার করি এবং ব্যবহার করি cin
, তবে আমি EOF
টিপে প্রবেশ না করা অবধি এটি ইনপুটটির অনুরোধ জানায় ctrl+d
?
cin.clear();
fflush(stdin);
কনসোল থেকে পড়ার সময় এটিই আমার জন্য কাজ করেছিল। অন্য প্রতিটি ক্ষেত্রে এটি হয় inde n অভাবের কারণে অনির্দিষ্টকালের জন্য পড়বে, বা কিছু বাফারে থাকবে।
সম্পাদনা: আমি জানতে পেরেছি যে পূর্ববর্তী সমাধানগুলি পরিস্থিতি আরও খারাপ করেছে। এই এক, কাজ করে:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
আমি এর দুটি সমাধান খুঁজে পেয়েছি।
প্রথম এবং সহজতম std::getline()
উদাহরণটি উদাহরণস্বরূপ:
std::getline(std::cin, yourString);
... এটি যখন নতুন লাইনে যাবে তখন ইনপুট স্ট্রিমটি বাতিল করবে। এখানে এই ফাংশন সম্পর্কে আরও পড়ুন ।
স্ট্রিমটিকে সরাসরি অস্বীকার করে এমন আর একটি বিকল্প হ'ল ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
শুভকামনা!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
কেমন:
cin.ignore(cin.rdbuf()->in_avail());
আমি পছন্দ করি:
cin.clear();
fflush(stdin);
একটি উদাহরণ রয়েছে যেখানে cin.ignore কেবল এটি কাটবে না, তবে আমি এই মুহূর্তে এটি ভাবতে পারি না। আমার যখন এটি ব্যবহার করার দরকার ছিল তখন এটি বেশ আগে ছিল (মিংডাব্লু সহ)।
তবে, fflush (stdin) মান অনুসারে অপরিবর্তিত আচরণ। fflush () কেবলমাত্র আউটপুট স্ট্রীমের জন্য বোঝানো হয়। fflush (stdin) কেবলমাত্র উইন্ডোজে (কমপক্ষে জিসিসি এবং এমএস সংকলক সহ) স্ট্যান্ডার্ড হিসাবে সি স্ট্যান্ডার্ডের এক্সটেনশন হিসাবে কাজ করবে বলে মনে হচ্ছে ।
সুতরাং, আপনি যদি এটি ব্যবহার করেন তবে আপনার কোড পোর্টেবল হবে না।
Fflush (stdin) ব্যবহার করে দেখুন ।
এছাড়াও, একটি বিকল্পের জন্য http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 দেখুন ।
আরেকটি সম্ভাব্য (ম্যানুয়াল) সমাধান হ'ল
cin.clear();
while (cin.get() != '\n')
{
continue;
}
আমি ক্লিওনের সাথে fflush বা cin.flush () ব্যবহার করতে পারি না যাতে এটি কার্যকর।
সহজ রাস্তা:
cin.seekg(0,ios::end);
cin.clear();
এটি কেবল স্টিডিন স্ট্রিমের শেষে সিন পয়েন্টারটি অবস্থান করে এবং সিনক্লায়ার () ইওএফ পতাকা হিসাবে সমস্ত ত্রুটি পতাকা সাফ করে।
নিম্নলিখিত কাজ করা উচিত:
cin.flush();
কিছু সিস্টেমে এটি উপলব্ধ নেই এবং তারপরে আপনি এটি ব্যবহার করতে পারেন:
cin.ignore(INT_MAX);
flush
পদ্ধতিটি কেবল আউটপুট জন্য এবং ইতিমধ্যে লিখিত অক্ষরগুলির সাথে সম্পর্কিত।
basic_istream<char>' has no member named 'flush'
cin.get()
অদ্ভুতভাবে এটি যথেষ্ট পরিমাণে স্বয়ংক্রিয়ভাবে প্রবাহিত হয়েছে বলে মনে হচ্ছে (সম্ভবত এটি পছন্দনীয় নয়, যেহেতু এটি বিভ্রান্তিকর এবং সম্ভবত স্বভাবজাত)।
এটা আমার জন্য কাজ করে। আমি গেটলাইন () এর সাথে লুপের জন্য ব্যবহার করেছি।
cin.ignore()