সি ++: "স্টাড :: এন্ডেল" বনাম "\ n"


568

অনেক সি ++ বইতে উদাহরণ কোড থাকে ...

std::cout << "Test line" << std::endl;

... তাই আমি সবসময় এটিও করেছি। তবে পরিবর্তে আমি এর মতো কার্যকারী বিকাশকারীদের কাছ থেকে প্রচুর কোড দেখেছি:

std::cout << "Test line\n";

একে অপরের চেয়ে বেশি পছন্দ করার কোনও প্রযুক্তিগত কারণ রয়েছে, বা এটি কেবল কোডিং শৈলীর বিষয়?


7
ভাল ব্যাখ্যা: cppkid.wordpress.com/2008/08/27/why-i-prefer-n-to-stdendl


25
@ এরোবার্ট এটি অন্যজনের চেয়ে বয়স্ক
কিরা

3
পছন্দ করুন তবে অন্যটির উত্তর আমাকে সামান্য আরও ভালভাবে আঘাত করে, তাই আমি এটিকে প্রায় কাছাকাছি করতে বেছে নিয়েছি। এছাড়াও, অন্য একটি সামান্য বিস্তৃত, এছাড়াও আচ্ছাদন '\n'
ডারোবার্ট

stackoverflow.com/a/30968225/3163618 একটি উল্লেখযোগ্য পারফরম্যান্স পার্থক্য থাকতে পারে।
Qwr

উত্তর:


473

বিবিধ লাইন-এন্ডিং অক্ষরগুলি কিছু আসে যায় না, ধরে নিচ্ছি ফাইলটি পাঠ্য মোডে খোলা আছে, যা আপনি বাইনারি না চাইতেই পাবেন। সংকলিত প্রোগ্রামটি সিস্টেমের জন্য সংকলিত সঠিক জিনিসটি লিখবে।

পার্থক্য হ'ল std::endlআউটপুট বাফারটি ফ্লাশ করে এবং '\n'তা করে না। আপনি যদি না চান বাফারটি ঘন ঘন ফ্লাশ হয় তবে ব্যবহার করুন '\n'। আপনি যদি করেন (উদাহরণস্বরূপ, আপনি যদি সমস্ত আউটপুট পেতে চান এবং প্রোগ্রামটি অস্থির হয়), ব্যবহার করুন std::endl


24
বা প্রতিটি আউটপুট ক্রিয়াকলাপের সাথে এটি unfuffered এবং ফ্লাশ হয়ে যাওয়ার ::std::cerrপরিবর্তে ব্যবহার করার কথা বিবেচনা করুন ::std::cout
সর্বজনীন

142
@ সর্বজনীন: কোনও স্টাড :: সারার ত্রুটির জন্য সংরক্ষণ করা উচিত নয়। দুটি স্ট্রিম একসাথে সিঙ্ক করা হয়নি তাই আপনি যদি কিছু পাঠ্য আউটপুট আউট করেন তবে তা বাফার হতে পারে এবং সেরার সরাসরি আউটপুটে চলে যাবে যার ফলস্বরূপ একটি মিশ্র মোড প্রদর্শন হবে। এটির (ত্রুটি) জন্য যা ধারণা করা হয় তার জন্য সেরার ব্যবহার করুন এবং এটি (স্বাভাবিক মিথস্ক্রিয়া) এর জন্য ডিজাইন করা হয়েছে তার জন্য কাউট করুন।
মার্টিন ইয়র্ক

23
@ লুকাস: '\ n' এর চেয়ে বেশি প্ল্যাটফর্ম সচেতন নয়।
সিবি বেইলি

32
@ লোকিআস্টারি: আমি বলতে চাই না যে stderr"ত্রুটি" রয়েছে। বরং, এটি-ব্যান্ড-ডায়াগনস্টিক বার্তাগুলির জন্য, যদি আপনি চান। ./prog > fileকেবল সত্য প্রোগ্রামের পেডলোড বলা এবং সংরক্ষণ করা উচিত , তবে প্রোগ্রামটি আরও অনেকগুলি স্থিতির তথ্য আউটপুট পছন্দ করতে পারে এমনকি সাধারণ মিথস্ক্রিয়াতেও।
কেরেক এসবি

13
"অনেকগুলি বাস্তবায়নে, স্ট্যান্ডার্ড আউটপুটটি লাইন-বাফার হয় এবং '\ n' লেখা যাইহোক ফ্লাশ সৃষ্টি করে, যদি না std :: cout.sync_with_stdio (মিথ্যা) কার্যকর করা হয়।" এখান থেকে অনুলিপি করা হয়েছে
GuLearn

249

পার্থক্যটি নিম্নলিখিত দ্বারা চিত্রিত করা যেতে পারে:

std::cout << std::endl;

সমতুল্য

std::cout << '\n' << std::flush;

সুতরাং,

  • std::endlআপনি যদি আউটপুটটিতে তাত্ক্ষণিকভাবে ফ্লাশ চাপাতে চান তবে ব্যবহার করুন ।
  • \nআপনি যদি পারফরম্যান্স সম্পর্কে চিন্তিত হন তবে ব্যবহার করুন (আপনি <<অপারেটরটি ব্যবহার করছেন যদি এটি সম্ভবত না হয় )।

আমি \nবেশিরভাগ লাইনে ব্যবহার করি ।
তারপরে std::endlঅনুচ্ছেদের শেষে ব্যবহার করুন (তবে এটি কেবল একটি অভ্যাস এবং সাধারণত প্রয়োজনীয় নয়)।

অন্যান্য দাবির বিপরীতে, \nচরিত্রটি কেবলমাত্র স্ট্রিমটি যদি কোনও ফাইলের ( std::cinএবং std::coutবিশেষ হওয়া সত্ত্বেও ফাইলগুলি (বা ফাইলের মতো)) এর দিকে চলে যায় তবে লাইন ক্রমের সঠিক প্ল্যাটফর্মের শেষে ম্যাপ করা হয় ।


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

9
@ লোকিস্টারি: আপনি << অপারেটর ব্যবহার করছেন, আপনি সম্ভবত অভিনয় সম্পর্কে চিন্তিত নন - কেন? আমি জানতাম না যে operator<<পারফরম্যান্ট নয়, বা পারফরম্যান্সের জন্য ব্যবহারের বিকল্প কী? এটি আরও বুঝতে দয়া করে আমাকে কিছু উপাদানের দিকে নির্দেশ করুন।
কিংবদন্তি

8
@ কিংবদন্তি 2 কে: একটি পুরানো স্ত্রীর গল্প রয়েছে যে সি ++ স্ট্রিমগুলি সি প্রিন্টফ () এর মতো পারফরম্যান্ট নয়। যদিও কিছুটা হলেও গতিতে মূল পার্থক্যটি সি ++ স্ট্রিমগুলি ভুলভাবে ব্যবহার করে is stackoverflow.com/a/1042121/14065 সি ++ এ আই -স্ট্রিমগুলি সি-স্ট্রিমগুলির সাথে সিঙ্ক করা মনে রাখবেন sync_with_stdio(false)এবং আপনার আউটপুট অবিচ্ছিন্নভাবে ফ্লাশ করবেন না। লাইব্রেরিটি কখন এটি করা উচিত work stackoverflow.com/a/1926432/14065
মার্টিন ইয়র্ক

6
@ লোকি: এখানে একটি নগর কিংবদন্তি রয়েছে যা স্টোডিওর sync_with_stdioমতো দ্রুত প্রবাহিত করে ost এটি হয় না
বেন ভয়েগট

2
@ বেনভয়েগট: আমি উপরের আমার কথাটি সম্পর্কে সতর্ক ছিলাম (তাই আমি তাদের সাথে খুশি)। এটি স্টডিওর মতো পারফরম্যান্ট নয় (কারণ এটি আরও বেশি করে)। কিন্তু স্টাডিওর সাথে সিঙ্কের কারণে লোকেরা প্রচুর পারফরম্যান্স ফাঁক সম্পর্কে অভিযোগ করে।
মার্টিন ইয়র্ক

40

পারফরম্যান্সের সমস্যা থাকতে পারে, std::endlআউটপুট প্রবাহকে স্রোতে বাধ্য করে।


1
এবং এটি স্থানীয় সিস্টেমের এই কাজটি আরও ভাল করার জন্য প্রয়োজনীয় অন্য যে কোনও প্রক্রিয়াজাতকরণ করতে পারে।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

30

আপনি যদি ব্যবহার করতে যাচ্ছেন তবে সেখানে আরও একটি ফাংশন কল রয়েছে lied std::endl

a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;

ক) অপারেটর <<একবার কল ।
খ) অপারেটরকে <<দুবার কল করে।


19
এটি সুস্পষ্ট হতে পারে তবে থ্রেডেড প্রোগ্রামগুলিতে এটির বিশাল প্রভাব রয়েছে যেখানে সাধারণত, প্রথম সংস্করণটি একটি শটে একটি একক লাইন লিখবে যেখানে দ্বিতীয় সংস্করণটি অন্য থ্রেড থেকে লেখার মাধ্যমে বিভক্ত হতে পারে। এটিকে এড়াতে প্রায়শই আমি নিজেকে std :: cout << "হ্যালো \ n" << স্টাডি :: ফ্লাশ লিখতে দেখি।
স্মারক করে

কি হবে std::cout << "Hello" << "\n";?
বাইসোর

1
@ বেক্সর অন্যান্য উত্তরগুলিতে বর্ণিত বাফার ফ্লাশিং ব্যতীত প্রায় একই। যাইহোক, আপনি দুটি স্ট্রিং লিটারেলগুলিকে একটিতে মার্জ করতে পারলে এটি অনর্থক।
iBug

ওয়েল, যদি স্ট্রিং ছাপা হবে না আক্ষরিক, তারপর কল হয় <<ক্ষেত্রে 2 হবে একটি হিসাবে ভাল, এইভাবে আমি এক বা দুই জন্য প্রয়োজন দাবি করবে না <<(সাধারণ বা দুই ফাংশান কল) একটি হতে \nএবং মধ্যে পার্থক্য endl
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস

লোল না, আমি I n এই কারণটি ব্যবহার করি না।
কার্লো উড

28

আমি স্ট্যান্ডার্ড এই সম্পর্কে পড়া স্মরণ, তাই এখানে যায়:

সি 11 স্ট্যান্ডার্ড দেখুন যা স্ট্যান্ডার্ড স্ট্রিমগুলি কীভাবে আচরণ করে তা নির্ধারণ করে, সি ++ প্রোগ্রাম সিআরটি ইন্টারফেস হিসাবে, সি 11 স্ট্যান্ডার্ডটি এখানে ফ্লাশিং নীতি পরিচালনা করতে হবে।

আইএসও / আইইসি 9899: 201x

7.21.3 §7

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

7.21.3 §3

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

এর অর্থ হ'ল std::coutএবং যদি তারা কোনও ইন্টারঅ্যাক্টিভ ডিভাইসটির উল্লেখ করে তবেইstd::cin সম্পূর্ণ বাফার হয়। অন্য কথায়, stdout যদি একটি টার্মিনালের সাথে সংযুক্ত থাকে তবে আচরণে কোনও পার্থক্য নেই।

তবে, যদি std::cout.sync_with_stdio(false)বলা হয়, তবে '\n'ইন্টারেক্টিভ ডিভাইসগুলিতে এমনকি ফ্লাশ সৃষ্টি করবে না। অন্যথায় ফাইলগুলিতে পাইপ না '\n'করা সমতুল্য std::endl: সি ++ এফ স্ট্যান্ড :: এন্ডেল এ


19

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



10

আপনি যদি Qt ব্যবহার করেন এবং endl, আপনি ভুলক্রমে ভুল ব্যবহার করে শেষ করতে পারেন endlযা আপনাকে খুব অবাক করে দেওয়ার ফলাফল দেয়। নিম্নলিখিত কোড স্নিপেট দেখুন:

#include <iostream>
#include <QtCore/QtCore> 
#include <QtGui/QtGui>

// notice that there is no "using namespace std;"
int main(int argc, char** argv)
{
    QApplication qapp(argc,argv);
    QMainWindow mw;
    mw.show();
    std::cout << "Finished Execution!" << endl;
    // This prints something similar to: "Finished Execution!67006AB4"
    return qapp.exec();
}

নোট করুন যে আমি endlপরিবর্তে লিখেছি std::endl(যা সঠিক হত) এবং স্পষ্টতই এখানে একটি endlফাংশন সংজ্ঞায়িত করা হয়েছে qtextstream.h এ (যা QtCore এর অংশ)।

কোনও সম্ভাব্য নেমস্পেসের সমস্যাগুলি পুরোপুরি পাশের "\n"পরিবর্তে ব্যবহার করা endl। এটি বিশ্বব্যাপী নেমস্পেসে (যেমন কিউটি ডিফল্টরূপে করে) প্রতিক চিহ্ন রাখা কেন এটি একটি ভাল উদাহরণ।


31
Urgh! কে কখন হতে চাইবে using namespace std;?? :-)
স্টিভ ফলি

2
কদর্য। মন্তব্যের জন্য ধন্যবাদ, আমি নিশ্চিত যে অন্যরা এতে প্রবেশ করবে।
হেড গিক

পুনঃটুইট কেন না?
ɐǝolɐǝz ǝɥʇ qoq

@ .olɐǝzǝɥʇqoq যতক্ষণ না আপনি হেডার ফাইলগুলিতে এটি করবেন না এটি ঠিক আছে।
স্মারলিন

1
@ ʇolɐǝzǝɥʇqoq দয়া করে এড়িয়ে চলুন using namespace std;। এটি খারাপ অভ্যাস হিসাবে বিবেচিত হয়। দেখুন কেন "নামস্থান এসটিডি ব্যবহার;" খারাপ অনুশীলন বিবেচনা?
এলএফ

2

আমার সবসময় কেবলমাত্র স্টাডি :: এন্ডেল ব্যবহার করার অভ্যাস ছিল কারণ এটি আমার পক্ষে দেখা সহজ।


2

std::endlম্যানিপ্যুলেটর সমতূল্য '\n'। তবে std::endlসর্বদা ধারা প্রবাহিত করে।

std::cout << "Test line" << std::endl; // with flush
std::cout << "Test line\n"; // no flush

1

আপনি যদি নিজের প্রোগ্রামটি নিজের ল্যাপটপ বাদে অন্য কোনও কিছুর উপর চালাতে চান তবে কখনও কখনও endlবিবৃতি ব্যবহার করবেন না । বিশেষত যদি আপনি অনেকগুলি শর্ট লাইন লিখছেন বা যেমন আমি প্রায়শই একটি ফাইলে একক অক্ষর দেখেছি। এর ব্যবহারটি endlএনএফএসের মতো নেটওয়ার্কযুক্ত ফাইল সিস্টেমগুলিকে হত্যা করতে জানে।


এটি কি ফ্লাশিংয়ের কারণে? আমি কীভাবে এটি সম্ভব হতে পারে তা দেখতে পাচ্ছি।
হেড গীক

পছন্দ করুন আমি এটিকে ডিস্ক আইওয়ের কর্মক্ষমতা নষ্ট করে দেখছি।
sbi

0

সঙ্গে রেফারেন্স এটি একটি হল আউটপুট শুধুমাত্র ইনপুট / আউটপুট ম্যানিপ্যুলেটর

std::endlআউটপুট সিকোয়েন্স ওএসে একটি নতুন লাইন অক্ষর সন্নিবেশ করানো হয় এবং os.put(os.widen('\n'))এরপরে কল করে যেন এটি ফ্লাশ করে os.flush()

কখন ব্যবহার করতে হবে:

এই ম্যানিপ্যুলেটর একটি লাইন উত্পাদন করতে ব্যবহার করা যেতে পারে অবিলম্বে আউটপুট ,

যেমন

দীর্ঘ-চলমান প্রক্রিয়া থেকে আউটপুট প্রদর্শন করার সময়, একাধিক থ্রেডের ক্রিয়াকলাপ বা অপ্রত্যাশিতভাবে ক্রাশ হতে পারে এমন কোনও প্রোগ্রামের লগিং ক্রিয়াকলাপ sh

এছাড়াও

প্রসারিত প্রক্রিয়া যদি কোনও স্ক্রিন I / O সম্পাদন করে তবে std :: সিস্টেমে কল দেওয়ার আগে std :: cout এর স্পষ্ট ফ্লাশও প্রয়োজনীয়। বেশিরভাগ অন্যান্য স্বাভাবিক ইন্টারেক্টিভ আই / ও দৃশ্যে, স্টাডি :: এনটল যখন স্টাডি :: সিউটের সাথে ব্যবহার করা হয় তখন অতিরিক্ত কাজ হয় কারণ স্ট্যান্ড :: সিন, আউটপুট থেকে স্ট্যান্ড :: সেরার বা প্রোগ্রাম সমাপ্তির কোনও ইনপুট স্ট্যান্ড :: কোটকে কল দেয় না .flush ()। কিছু উত্স দ্বারা উত্সাহিত '\ n' এর জায়গায় std :: endl এর ব্যবহার আউটপুট কার্য সম্পাদনকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে।

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