2010-06-26 15 views
7

तो istringstream प्रतियां एक स्ट्रिंग की सामग्री को जब initialised, उदागैर कॉपी करने istringstream

string moo("one two three four"); 
istringstream iss(moo.c_str()); 

वहाँ std::istringstream चीजों को कॉपी किए बिना दिया c_str अपने बफर के रूप में उपयोग करने के लिए एक तरीका है मैं सोच रहा था। इस तरह, std::istringstream& को istream& को तर्क के रूप में लेने वाले कार्यों के लिए पास करने से पहले इसे स्मृति की बड़ी बिट कॉपी करने की आवश्यकता नहीं होगी।

जो कुछ मैं करने की कोशिश कर रहा हूं वह कुछ कार्यों को परिवर्तित करता है जो istream& लेने में केवल std::ifstream& तर्क (वे अधिकतर पार्सर्स) लेते हैं। क्या मुझे इसके लिए अपना खुद का istream सबक्लास बनाना होगा?

+0

देखें [यह उत्तर] (http: // stackoverflow।कॉम/प्रश्न/2786816/कैसे-से-create-c-istringstream-from-a-char-array-with-null0-characters/2786872 # 2786872) ऐसा करने के लिए (मूल रूप से @ चार्ल्स के समाधान के समान, लेकिन लपेटना सुविधा के लिए इसके आसपास एक 'istream')। –

उत्तर

3

यह काफी एक बुनियादी std::streambuf वर्ग है कि किसी भी स्मृति क्षेत्र से पढ़ता लिखने के लिए तुच्छ है। इसके बाद आप इसे istream बना सकते हैं और उससे पढ़ सकते हैं।

initializing a C++ std::istringstream from an in memory buffer?

ध्यान दें कि बफर के जीवन होने की c_str() बहुत ही सीमित है, हालांकि है, और कोई गारंटी नहीं कि c_str() के लिए एक कॉल कुछ नकल हालांकि मैं किसी भी कार्यान्वयन की पता नहीं है कारण चाहते हैं वहाँ बताया जहां यह कर देता है।

+0

आह, इसके लिए धन्यवाद, यह एक कोशिश करेगा। यह कल्पना की तुलना में यह बहुत आसान लगता है कि यह होगा :) – kamziro

2

केवल एक प्रति है क्योंकि आपके द्वारा पारित पैरामीटर, const char*, istringstream constructor के तर्क प्रकार में रूपांतरण की आवश्यकता है।

c_str() पर कॉल किए बिना बस string में पास करें।

istringstream iss(moo); 

ठीक है, यह पूरी तरह से प्रतिलिपि को रोकने से नहीं रोकता है, लेकिन यह एक अनावश्यक प्रति को समाप्त करता है। प्रतिलिपि को पूरी तरह खत्म करने के लिए, आपको std::stringbuf को फिर से लिखना होगा, जो विशेष रूप से string पर आपको सीधे काम करने से बचाता है।

2

यह एक std :: स्ट्रिंग करता है पर निर्भर करता है। 27.2.1/1 The class basic_istringstream<charT,traits,Allocator> ... uses a basic_stringbuf<charT,traits,Allocator> object to control the associated storage. के अनुसार कक्षा के किसी ऑब्जेक्ट का उपयोग करना चाहिए, इसलिए उसे उस ऑब्जेक्ट में स्ट्रिंग का निर्माण करना होगा।

तो असली सवाल नहीं है कि क्या एक stringstream प्रतियां सामग्री है, लेकिन है कि क्या प्रति एक स्ट्रिंग सामग्री की प्रतिलिपि या कॉपी-ऑन-राइट योजना के कुछ प्रकार को लागू करेगा निर्माण।

3

बहिष्कृत istrstream इस सुविधा का समर्थन करता है।

#include <string> 
#include <strstream> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    string moo = "one two three four"; 
    istrstream istr(const_cast<char*>(moo.c_str()),moo.size()); 
    std::string line; 
    while(!istr.fail() && !istr.eof()){ 
     getline(istr,line,' '); 
     cout << line << "_"; 
    } 
    // prints: one_two_three_four_ 
} 
+0

'क्षमता()' का उपयोग गलत है, यह 'आकार()' होना चाहिए। – sbi

+0

@ एसबीआई: मेरा बुरा, मैंने पहले स्ट्रस्ट्रीम के साथ कुछ परीक्षण किए थे, उस से बचे हुए थे, ठीक है अब ठीक है। – smerlin

2

istringstream का उपयोग एक संतोषजनक समाधान नहीं है, क्योंकि यह पूरे बफर की प्रतिलिपि बनाता है।

पिछले जवाब पदावनत istrstream चलता है, लेकिन के रूप में इस चेतावनी उत्पन्न करता है और भविष्य में निकाला जा सकता है, एक बेहतर समाधान का उपयोग है boost::iostreams:

boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size()); 

यह उसी तरह istrstream किया में बफर कॉपी करने से बचा जाता है , और आपको अपनी स्ट्रीम कक्षा लिखने के लिए बचाता है।