আমি কীভাবে সিন বাফারটি ফ্লাশ করব?


উত্তর:


101

সম্ভবত:

std::cin.ignore(INT_MAX);

এটি পড়তে এবং যতক্ষণ না সমস্ত কিছু উপেক্ষা করবে EOF। (আপনি দ্বিতীয় আর্গুমেন্টও সরবরাহ করতে পারেন যা পড়ার মতো চরিত্রটি (যেমন: '\n'একটি লাইন উপেক্ষা করার জন্য))।

এছাড়াও: আপনি সম্ভবত একটি করতে চান: এর std::cin.clear();আগেও স্ট্রিমের স্থিতি পুনরায় সেট করতে।


10
(পুরাতন আমি জানি)
GManNickG

ধন্যবাদ, জিএম! প্রথমে এটি কি ভুল উপায়ে করেছে এবং আমার ভুল সন্ধানের জন্য বেশ কিছুটা সময় ব্যয় করেছে।
বালু

@GManNickG, সবেমাত্র উত্তর ঠিক করেছেন।
বিডব্লিউড্রাকো

@ ড্রাগনলর্ড: সুস্পষ্ট সমাধানটি আমার অন্ধকারে করা উচিত ছিল, ধন্যবাদ। :)
GManNGG

3
কেবল এটিই উল্লেখ করতে চেয়েছিলাম যে আমার মামলার জন্য আমি '' n 'প্রয়োজনীয় খুঁজে পেয়েছি। অন্যথায় পরবর্তীকালে "সিন >>" কাজ করে না।
কার্ডিন

114

আমি সি সংস্করণগুলির তুলনায় সি ++ আকারের সীমাবদ্ধতাগুলি পছন্দ করব:

// 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')

15
আরও গুরুত্বপূর্ণ, মানগুলি পৃথক হতে পারে! (স্ট্রিমাইজটি ইনট হতে হবে না)

2
আপনি দয়া করে দয়া করে এমন একটি উদাহরণ উল্লেখ করতে পারেন যেখানে আমাদের ফাইলের শেষে উপেক্ষা করা দরকার কারণ যদি আমি বাফারটি cinফ্লাশ করতে উপরের প্রথম বিবৃতিটি ব্যবহার করি এবং ব্যবহার করি cin, তবে আমি EOFটিপে প্রবেশ না করা অবধি এটি ইনপুটটির অনুরোধ জানায় ctrl+d?
অজয়

@ জায়ে: না এটি আপনার সিদ্ধান্ত নেওয়ার দরকার। উপরোক্ত কী করবে তা আমি কেবল ব্যাখ্যা করছি।
মার্টিন ইয়র্ক

23
cin.clear();
fflush(stdin);

কনসোল থেকে পড়ার সময় এটিই আমার জন্য কাজ করেছিল। অন্য প্রতিটি ক্ষেত্রে এটি হয় inde n অভাবের কারণে অনির্দিষ্টকালের জন্য পড়বে, বা কিছু বাফারে থাকবে।

সম্পাদনা: আমি জানতে পেরেছি যে পূর্ববর্তী সমাধানগুলি পরিস্থিতি আরও খারাপ করেছে। এই এক, কাজ করে:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

13

আমি এর দুটি সমাধান খুঁজে পেয়েছি।

প্রথম এবং সহজতম std::getline()উদাহরণটি উদাহরণস্বরূপ:

std::getline(std::cin, yourString);

... এটি যখন নতুন লাইনে যাবে তখন ইনপুট স্ট্রিমটি বাতিল করবে। এখানে এই ফাংশন সম্পর্কে আরও পড়ুন ।

স্ট্রিমটিকে সরাসরি অস্বীকার করে এমন আর একটি বিকল্প হ'ল ...

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

শুভকামনা!


9
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";

5

কেমন:

cin.ignore(cin.rdbuf()->in_avail());

3
স্ট্র্যামবুফের ইন_ওয়ায়েল () ফাংশনটি অবিশ্বাস্য এবং অনেকগুলি প্রয়োগগুলি কেবল শূন্য ফিরে আসে। দেখুন: connect.microsoft.com/VisualStudio/feedback/details/509337/... GNU এর libc ++, অনুরূপ
জেমস Caccese

4

আমি পছন্দ করি:

cin.clear();
fflush(stdin);

একটি উদাহরণ রয়েছে যেখানে cin.ignore কেবল এটি কাটবে না, তবে আমি এই মুহূর্তে এটি ভাবতে পারি না। আমার যখন এটি ব্যবহার করার দরকার ছিল তখন এটি বেশ আগে ছিল (মিংডাব্লু সহ)।

তবে, fflush (stdin) মান অনুসারে অপরিবর্তিত আচরণ। fflush () কেবলমাত্র আউটপুট স্ট্রীমের জন্য বোঝানো হয়। fflush (stdin) কেবলমাত্র উইন্ডোজে (কমপক্ষে জিসিসি এবং এমএস সংকলক সহ) স্ট্যান্ডার্ড হিসাবে সি স্ট্যান্ডার্ডের এক্সটেনশন হিসাবে কাজ করবে বলে মনে হচ্ছে ।

সুতরাং, আপনি যদি এটি ব্যবহার করেন তবে আপনার কোড পোর্টেবল হবে না।

Fflush (stdin) ব্যবহার করে দেখুন ।

এছাড়াও, একটি বিকল্পের জন্য http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 দেখুন ।


9
fflush (stdin); অপরিজ্ঞাত আচরণ (সি প্রোগ্রামিং ভাষার ভাষায়), 7.18.5.2/2 এ স্পষ্টভাবে বলা হয়েছে
কিবিবি

1
বৈধ, কার্যকরী কুলডেজ সরবরাহের জন্য +1। কিছু লোকের চাকরি অন্যের মান থাকে।
মিখাইল

5
@ মিখাইল: আপনার কাজের মধ্যে স্ট্যান্ডার্ড কমপ্লায়েন্ট কোড অন্তর্ভুক্ত করা উচিত। ভবিষ্যতে আপনার লেখা কোনও কিছুই ব্যবহার এড়াতে আমি নিশ্চিত করব।
এড এস।

4

আরেকটি সম্ভাব্য (ম্যানুয়াল) সমাধান হ'ল

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

আমি ক্লিওনের সাথে fflush বা cin.flush () ব্যবহার করতে পারি না যাতে এটি কার্যকর।


আমার জন্য অসীম লুপ।
স্টারওয়াইন্ড0

এটি কেবল লাইনের শেষ থাকলেই কাজ করছে, অন্যথায় অসীম লুপ
ববুল মেন্টল

2

সহজ রাস্তা:

cin.seekg(0,ios::end);
cin.clear();

এটি কেবল স্টিডিন স্ট্রিমের শেষে সিন পয়েন্টারটি অবস্থান করে এবং সিনক্লায়ার () ইওএফ পতাকা হিসাবে সমস্ত ত্রুটি পতাকা সাফ করে।


1

নিম্নলিখিত কাজ করা উচিত:

cin.flush();

কিছু সিস্টেমে এটি উপলব্ধ নেই এবং তারপরে আপনি এটি ব্যবহার করতে পারেন:

cin.ignore(INT_MAX);

1
আপনি যখন ইএনএফএমএক্স (দ্বিতীয় প্যারামের ডিফল্ট মান) না পৌঁছাবেন ততক্ষণ পঠিত INT_MAX অক্ষরকে উপেক্ষা করতে পারবেন যখন ম্যানুয়ালি একটি লুপ লিখবেন।
ইভান তেরান

গুনার, সেক্ষেত্রে আপনার পোস্টটি সম্পাদন করার জন্য এটি আরও ভাল হতে পারে।
দানা দ্য সনে

1
আমি যতদূর বলতে পারি, flushপদ্ধতিটি কেবল আউটপুট জন্য এবং ইতিমধ্যে লিখিত অক্ষরগুলির সাথে সম্পর্কিত।
মার্ক ভ্যান লিউউইন

cin.flush ():basic_istream<char>' has no member named 'flush'
এরিক

1
#include <stdio_ext.h>

এবং তারপরে ফাংশনটি ব্যবহার করুন

__fpurge(stdin)

0

cin.get() অদ্ভুতভাবে এটি যথেষ্ট পরিমাণে স্বয়ংক্রিয়ভাবে প্রবাহিত হয়েছে বলে মনে হচ্ছে (সম্ভবত এটি পছন্দনীয় নয়, যেহেতু এটি বিভ্রান্তিকর এবং সম্ভবত স্বভাবজাত)।


0

এটা আমার জন্য কাজ করে। আমি গেটলাইন () এর সাথে লুপের জন্য ব্যবহার করেছি।

cin.ignore()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.