একটি স্ট্রিম ম্যানিপুলেটর (এন্ডেল) বা একটি নতুন লাইন অব্যাহতি অক্ষর (\ n) ব্যবহার করছেন?


12

আমার কাছে একটি নির্দিষ্ট প্রসঙ্গ নেই যার মধ্যে আমি প্রশ্নটি জিজ্ঞাসা করছি, তবে আমি যখন সি ++ তে একটি শিক্ষানবিশ বইটি পড়ছিলাম তখন আমি কোনও স্ট্রিম অবজেক্টের সাথে লেনদেন করার সময় একটি আন্ডার স্ট্রিম ম্যানিপুলেটর এবং একটি নিউলাইন পলায়ন চরিত্র উভয়ের ব্যবহার লক্ষ্য করেছি।

এক্সম্যাপলটি নিম্নরূপ:

cout << "Hello World" << endl;
cout << "Hello World\n";

আমার প্রশ্নগুলি হ'ল:

  1. কোনও নির্দিষ্ট পরিস্থিতিতে স্ট্রিম ম্যানিপুলেটার (এন্ডেল) এবং অন্যটি থেকে পালানোর চরিত্রটি ব্যবহার করা কি আরও উপযুক্ত?
  2. দুটির মধ্যে একটি ব্যবহার করার দক্ষতা বুদ্ধিমান কি আছে?
  3. এগুলি কি পুরোপুরি বিনিময়যোগ্য?
  4. আমি পড়েছি যে একটি পালানোর ক্রমটি একটি একক চরিত্র হিসাবে স্মৃতিতে জমা রয়েছে। এর অর্থ কী আপনি যদি কম স্মৃতিশক্তি গ্রহণের জন্য চলে যান তবে এন্ডেল ব্যবহার করা আরও উপযুক্ত?
  5. স্ট্রিম ম্যানিপুলেটারটি কী কোনও উপায়ে স্মৃতি ব্যবহার করে, যদি তা হয় তবে পালানোর ক্রমের চেয়ে আরও বেশি কিছু হয়?

ধন্যবাদ, স্ট্যাক এক্সচেঞ্জের ক্ষমা প্রার্থনা যদি আমি এটি ভুল বিভাগে পোস্ট করি তবে আমি ভেবেছিলাম এটি ডেটা স্ট্রাকচার হিসাবে গণ্য।


2
এন্ডেল কিছু স্ট্রিমে ফ্লাশও সৃষ্টি করে, '\ n' করে না।
জেমস

উত্তর:


12

o << std::endl নিম্নলিখিত কোডের সমতুল্য:

o.put(o.widen('\n'));
o.flush();

অন্য কথায়, আপনি std::endlযখন কেবল স্ট্রিমটি ফ্লাশ করার প্রয়োজন তখন আপনার ব্যবহার করা উচিত । উদাহরণ স্বরূপ:

  • আপনি একটি সময় ব্যয়কারী অপারেটিং সম্পাদন করতে চলেছেন এবং এটি করার আগে আপনি কোনও বার্তা প্রদর্শন করেছেন কিনা তা নিশ্চিত করতে চান।
  • আরেকটি প্রক্রিয়া আপনার আউটপুটটির জন্য অপেক্ষা করছে।
  • যদি একাধিক থ্রেড বা প্রক্রিয়া চলমান থাকে তবে আপনার আউটপুটটি ফ্লাশ করতে হতে পারে যাতে প্রতিটি থ্রেড বা প্রক্রিয়া থেকে আউটপুট সঠিকভাবে প্রদর্শিত হয়। (অন্যথায়, আপনি বিশ্রী বিরতিতে ইন্টারলিভড আউটপুটগুলির আপাতদৃষ্টিতে এলোমেলো ব্লকগুলি পেতে পারেন))

আপনার যদি স্ট্রিম ফ্লাশ করার প্রয়োজন না হয় তবে তার \nপরিবর্তে ব্যবহার করুন std::endl। অতিরিক্ত কলগুলি flushকর্মক্ষমতা (কখনও কখনও উল্লেখযোগ্যভাবে) ক্ষতি করতে পারে)

আরও তথ্যের জন্য, cppreferences.com দেখুন

স্মৃতি ব্যবহার সম্পর্কে: \nবনাম সম্পর্কে চিন্তিত হওয়া std::endlঅবশ্যই একটি অযৌক্তিক মাইক্রো-অপ্টিমাইজেশন, তবে সাধারণভাবে, আমি \nকম মেমরি নেওয়ার আশা করি । \nমাত্র এক একটি স্ট্রিং আক্ষরিক শেষে আরো বাইট, যখন লেখা হয় std::endlমধ্যে কম্পাইলার (সম্ভবত inlined) এর ফাংশন কল দ্বারা অনুবাদ করা হয় putএবং flush

লাইন শেষা w শ মধ্যে প্ল্যাটফর্ম-নির্দিষ্ট পার্থক্য (উইন্ডোজ \r\nLinux এবং OS X এর বনাম \n) তুলনায় কম পর্যায়ে পরিচালনা করা হয় std::endlএবং \n:

  • যদি কোনও স্ট্রিম পাঠ্য মোডে খোলা হয়, তবে আপনি যদি লিখেন তবে \nএটি স্বয়ংক্রিয়ভাবে এটিকে যথাযথ প্ল্যাটফর্ম-নির্দিষ্ট লাইন সমাপ্তিতে অনুবাদ করে। আপনি যদি প্লাটফর্ম-নির্দিষ্ট লাইনটি শেষ হয়ে পড়ে থাকেন তবে স্ট্রিমটি এটি স্বয়ংক্রিয়ভাবে এতে অনুবাদ করে \n
  • যদি কোনও স্ট্রিম বাইনারি মোডে খোলা হয়, তবে তারা ভারব্যাটিমের মাধ্যমে কোনও লাইন শেষ করে এবং এটি আপনার উপর নির্ভর করে।
  • জন্য std::coutএবং std::cinবিশেষ করে, তারা চিকিত্সা করছি যেন তারা টেক্সট মোড।

1

1) বহনযোগ্যতার জন্য, ব্যবহার করুন endl। উইন্ডোজ নিউলাইনগুলি হ'ল \r\nলিনাক্স \nএবং ম্যাক \r সম্পাদনা: মন্তব্য অনুসারে, লাইন সিস্টেমের নির্দিষ্ট শেষগুলি নিম্ন স্তরে পরিচালিত হয়।

2) endlপ্রবাহ flushes, "\n"না।

3) বহনযোগ্যতার উপর নির্ভর করে।

মেমরির ব্যবহার হিসাবে, আপনি যত তাড়াতাড়ি সম্ভব অন্যান্য স্টোরেজে ফ্লাশ করে এটি হ্রাস করতে পারেন endl। তবে এটি কর্মক্ষমতা হ্রাস পাবে।

সম্পাদনা করুন: কিছু ভুল সাফ করুন।


2
ওএস এক্সের পর থেকে ম্যাক ইউনিক্স ভিত্তিক এবং \nএটি কোনও আধুনিক মেশিনেও রয়েছে।

7
দুঃখিত, তবে এটি ভুল। endlএবং \nপ্ল্যাটফর্ম-নির্দিষ্ট লাইন সমাপ্তির সাথে সমান; প্ল্যাটফর্মের পার্থক্যগুলি নিম্ন স্তরে পরিচালিত হয়।
জোশ কেলি

2
আপনার প্রথম বক্তব্য ভুল। endl () প্রবাহে '\ n' প্রেরণ করে (এটি প্রবাহিত করার পাশাপাশি)। '\ N' অক্ষরটি প্ল্যাটফর্ম নির্দিষ্ট End of line sequence( রূপান্তর পাঠ্য মোডে) তে রূপান্তরিত হয় । End of line sequenceফাইল থেকে পড়লে ' The n`' এ আবার রূপান্তরিত হয়। পয়েন্ট 3) সন্দেহজনক। এবং শেষ অনুচ্ছেদটি আবারও ভুল: ফ্লাশিং আপনার স্থান বাঁচাবে না এবং প্রয়োজনের চেয়ে বেশি ফ্লাশ করা আপনার কোডকে ধীর করে দেবে (বাফারের মূল বিষয় হচ্ছে ধীর ডিভাইসে লেখার দক্ষতা উন্নত করা)।
মার্টিন ইয়র্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.