Istringstream, ostringstream এবং স্ট্রিংস্ট্রিম মধ্যে পার্থক্য কি? / কেন প্রতিটি ক্ষেত্রে স্ট্রিংস্ট্রিম ব্যবহার করবেন না?


163

যখন আমি ব্যবহার করেন std::istringstream, std::ostringstreamএবং std::stringstreamএবং কেন আমি শুধু ব্যবহার করা উচিত নয় std::stringstreamযে দৃশ্যকল্প মধ্যে (কোন রানটাইম কর্মক্ষমতা বিষয় আছে?)।

শেষ অবধি, এ সম্পর্কে খারাপ কিছু আছে (একেবারে স্ট্রিম ব্যবহারের পরিবর্তে):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";

উত্তর:


119

ব্যক্তিগতভাবে, আমি এটি খুব বিরল দেখতে পাই যে আমি একই স্ট্রিম স্ট্রিমের বাইরে এবং বাইরে স্ট্রিমিং করতে চাই।

সাধারণত আমি হয় স্ট্রিং থেকে একটি স্ট্রিম শুরু করতে এবং তারপরে পার্স করতে চাই; বা জিনিসগুলিকে স্ট্রিং স্ট্রিমে প্রবাহিত করুন এবং তারপরে ফলাফলটি বের করে স্টোর করুন।

আপনি যদি একই স্ট্রিমে এবং থেকে স্ট্রিমিং করেন তবে আপনাকে স্ট্রিমের অবস্থা এবং স্ট্রিমের অবস্থানগুলি সম্পর্কে খুব সাবধানতা অবলম্বন করতে হবে।

ব্যবহার 'শুধু' istringstreamবা ostringstreamভাল আপনার অভিপ্রায় প্রকাশ এবং আপনি যেমন আপতিক ব্যবহার নিরীহ ভুল বিরুদ্ধে পরীক্ষণ দেয় <<বনাম >>

সেখানে পারে কিছু কর্মক্ষমতা বৃদ্ধি হবে কিন্তু আমি যে প্রথম খুঁজছেন না করা হবে।

আপনি যা লিখেছেন তাতে কোনও ভুল নেই। যদি আপনি দেখতে পান যে এটি যথেষ্ট পরিমাণে সম্পাদন করে না, তবে আপনি অন্যান্য পদ্ধতির প্রোফাইল করতে পারেন, অন্যথায় যা পরিষ্কার with ব্যক্তিগতভাবে, আমি কেবল এই জন্য যাব:

std::string stHehe( "Hello stackoverflow.com!" );

22

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

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


17

বেশিরভাগ ক্ষেত্রে, আপনি একই স্ট্রিং স্ট্রিমে নিজেকে ইনপুট এবং আউটপুট উভয়েরই প্রয়োজন খুঁজে পাবেন না, সুতরাং ব্যবহার std::ostringstreamএবং std::istringstreamস্পষ্টতই আপনার উদ্দেশ্যটি পরিষ্কার করে। এটি আপনাকে দুর্ঘটনাক্রমে ভুল অপারেটর ( <<বনাম >>) টাইপ করতে বাধা দেয় ।

যখন আপনাকে একই স্ট্রিমে উভয় ক্রিয়াকলাপ করতে হবে আপনি অবশ্যই সাধারণ উদ্দেশ্য সংস্করণটি ব্যবহার করবেন।

পারফরম্যান্সের সমস্যাগুলি এখানে আপনার উদ্বেগগুলির মধ্যে সবচেয়ে কম হবে, স্পষ্টতা হ'ল প্রধান সুবিধা।

আপনাকে খাঁটি স্ট্রিংগুলি তৈরি করতে হবে বলে শেষ পর্যন্ত স্ট্রিং এপেন্ড ব্যবহার করে কোনও ভুল নেই। পার্লের মতো ভাষাগুলিতে আপনার মতো সংখ্যার সমন্বয় করতে আপনি এটি ব্যবহার করতে পারবেন না।


8

istringstream ইনপুট জন্য, আউটপুট জন্য অস্ট্রিং স্ট্রিম। স্ট্রিংস্ট্রিম ইনপুট এবং আউটপুট। আপনি স্ট্রিংস্ট্রিমটি বেশিরভাগ জায়গায় ব্যবহার করতে পারেন। তবে, আপনি যদি অন্য কোনও ব্যবহারকারীকে আপনার অবজেক্ট দেন এবং এটি অপারেটর ব্যবহার করে >> আপনি যেখানে কেবল লেখার জন্য কেবল অপেক্ষা করেন, আপনি খুশি হবেন না ;-)

PS: এটি সম্পর্কে খারাপ কিছুই নয়, কেবল পারফরম্যান্সের সমস্যা।


2

আপনার তৃতীয় প্রশ্নের উত্তর দিতে: না, এটি পুরোপুরি যুক্তিসঙ্গত। স্ট্রিমগুলি ব্যবহার করার সুবিধা হ'ল আপনি যে কোনও ধরণের মান operator<<সুনির্দিষ্ট করে দিতে পারেন যা আপনি কেবল একটিতে স্ট্রিং (সি ++ বা সি) যোগ করতে পারেন std::string


1

সম্ভবত যখন আপনার ক্রিয়াকলাপের জন্য কেবল সন্নিবেশ বা কেবল নিষ্কাশনই উপযুক্ত হয় আপনি অযাচিত অপারেশন বাদ দিতে 'i' বা 'o' উপসর্গযুক্ত সংস্করণ ব্যবহার করতে পারেন।

যদি এটি গুরুত্বপূর্ণ না হয় তবে আপনি i / o সংস্করণটি ব্যবহার করতে পারেন।

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


1

std :: ostringstream :: str () স্ট্রিমের সামগ্রীর অনুলিপি তৈরি করে, যা কিছু পরিস্থিতিতে মেমরির ব্যবহার দ্বিগুণ করে। এটি এড়াতে আপনি std :: স্ট্রিংস্ট্রিম এবং এর rdbuf () ফাংশনটি ব্যবহার করতে পারেন।

এখানে আরও বিশদ: কীভাবে সরাসরি কোটটিতে অস্ট্রিং স্ট্রিম লিখবেন


0

উদাহরণস্বরূপ, যদি কেবলমাত্র এটি থেকে পড়তে হয় তবে পঠন / লেখার অ্যাক্সেসের জন্য কোনও ফাইল কেন খুলবেন?

যদি একাধিক প্রক্রিয়া একই ফাইল থেকে পড়তে প্রয়োজন?

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