2010-12-28 13 views
12

मेरे कोड में एक लूप है जो स्ट्रिंगस्ट्रीम के लिए "संख्या" की तरह sth जोड़ता है। जब यह समाप्त होता है, तो मुझे ',' add '}' निकालने की आवश्यकता होती है और यदि लूप को दोहराया जाता है तो '{' जोड़ें।स्ट्रिंगस्ट्रीम से चार हटाएं और कुछ डेटा संलग्न करें

मैंने सोचा कि मैं अनदेखा() को हटाने के लिए उपयोग कर सकता हूं, लेकिन यह काम नहीं करता है। क्या आप जानते हैं कि मैं जो वर्णन कर सकता हूं वह मैं कैसे कर सकता हूं?

उदाहरण:

douCoh << '{'; 
for(unsigned int i=0;i<dataSize;i++) 
    if(v[i].test) douCoh << i+1 << ','; 
douCoh.get(); douCoh << '}'; 
+1

कृपया अपने बिंदु को स्पष्ट करने के लिए कुछ उदाहरण जोड़ें। –

उत्तर

22

आप स्ट्रिंग (str() सदस्य के साथ) निकाल सकते हैं, std::string::erase के साथ अंतिम char को हटाएं और फिर नई स्ट्रिंग को std::ostringstream पर बफर के रूप में रीसेट करें।

std::ostringstream douCoh; 
const char* separator = ""; 

douCoh << '{'; 
for (size_t i = 0; i < dataSize; ++ i) 
{ 
    if (v[i].test) 
    { 
    douCoh << separator << i + 1; 
    separator = ","; 
    } 
} 
douCoh << '}'; 
+0

अरे, आप कुछ सेकंड से तेज़ी से थे ... – RedX

+0

अच्छा; इसे ले लो :) –

0

आप std::string::erase का उपयोग अंतर्निहित स्ट्रिंग से सीधे अंतिम वर्ण दूर करने के लिए कर सकता है।

+1

मैं अंतर्निहित स्ट्रिंग कैसे प्राप्त कर सकता हूं? str() स्ट्रिंग की एक प्रति एक संदर्भ नहीं देता है, है ना? –

+0

हां, आपको str() का उपयोग करके सामग्री की प्रति प्राप्त होती है। – RedX

+1

'std :: ostringstream :: str' फ़ंक्शन का एक और ओवरराइड है जो बफर को बदलने की अनुमति देता है। हालांकि, इस समाधान में बफर सामग्री की दो प्रतिलिपि लागत होती है, जो कि कॉस्ली हो सकती है। –

0

क्यों नहीं बस काउंटर की जाँच करें:

हालांकि, एक बेहतर समाधान पहली जगह में ज़रूरत से ज़्यादा ',' सम्मिलित नहीं करने के लिए, ऐसा ही कुछ करके हो सकता है? और ','

douCoh << '{'; 
for(unsigned int i=0;i<dataSize;i++){ 
    if(v[i].test){ 
    douCoh << i+1; 
    if(i != dataSize - 1) douCoh << ','; 
    } 
} 
/*douCoh.get();*/ douCoh << '}'; 
+0

मुझे लगता है कि काउंटर की जांच करना संभव नहीं है क्योंकि कुछ ऐसी वस्तुएं हो सकती हैं जो परीक्षण पास नहीं करती हैं। एक और काउंटर आवश्यक है (जो एक बूल हो सकता है), या विभाजक चर बदलने की मेरी चाल का उपयोग किया जा सकता है। –

+0

कोड [i] के लिए v [j] .test के मूल्य की भविष्यवाणी करना असंभव है। –

0

std :: copy, iterators और लक्षणों के साथ मज़े करें। आपको या तो यह मानना ​​है कि आपका डेटा उलटा (अंत -1) है या आपके आउटपुट को रिवाइंड किया जा सकता है। मुझे लगता है कि रिवाइंड करना आसान था।

#include <ostream> 
#include <algorithm> 
#include <iterator> 

namespace My 
{ 
    template<typename Iterator> 
    void print(std::ostream &out, Iterator begin, Iterator end) 
    { 
    out << '{'; 
    if (begin != end) { 
     Iterator last = end - 1; 
     if (begin != last) { 
     std::copy(begin, last, std::ostream_iterator< typename std::iterator_traits<Iterator>::value_type >(out, ", ")); 
     } 
     out << *last; 
    } 
    out << '}'; 
    } 
} 

#include <iostream> 

int main(int argc, char** argv) 
{ 
    My::print(std::cout, &argv[0], &argv[argc]); 
    std::cout << '\n'; 
} 
+0

अन्यथा, आपको std :: प्रतिलिपि पर भरोसा करने के बजाय पूर्ण लूप लिखना होगा। –

+0

मुझे लगता है कि वह बहुत सारे कोड लिखने से बचना चाहता था ... –

2
stringstream douCoh; 
for(unsigned int i=0;i<dataSize;i++) 
    if(v[i].test) 
    douCoh << (douCoh.tellp()==0 ? '{' : ',') << i+1; 
douCoh << '}'; 
+0

स्टैक ओवरव्लो में आपका स्वागत है! यह उपयोगी होगा अगर आपने उन लोगों के लिए अपना कोड समझाया जो इसे समझ में नहीं आते हैं। – ajacian81

+0

+1। यह मेरा निजी पसंदीदा है। – refi64

0

मैं इस तरह से C++ 11 के बाद से pop_back() स्ट्रिंग की विधि का उपयोग मिल गया है। शायद ऊपर स्मार्ट के रूप में इतना अच्छा नहीं है, लेकिन अधिक जटिल मामलों और/या आलसी लोगों के लिए उपयोगी है।

douCoh << '{'; 
for(unsigned int i=0;i<dataSize;i++) 
    if(v[i].test) douCoh << i+1 << ','; 

string foo(douCoh.str()); 
foo.pop_back(); 
douCoh.str(foo); 
douCoh.seekp (0, douCoh.end); 

douCoh << '}'; 
21

आप stringstream की तलाश और वापस 1 चरित्र जाना, stringstream::seekp का उपयोग कर सकते हैं। ध्यान दें कि यह अंतिम चरित्र को नहीं हटाता है, लेकिन केवल लेखन सिर को ले जाता है। यह इस मामले में पर्याप्त है, क्योंकि हम } के साथ अंतिम वर्ण को ओवरराइट करते हैं।

douCoh << '{'; 
for(unsigned int i=0;i<dataSize;i++) 
    if(v[i].test) douCoh << i+1 << ','; 
douCoh.seekp(-1,douCoh.cur); douCoh << '}'; 
8

मैं यह बहुत ही समस्या पड़ा है और मुझे पता चला है कि आप केवल कर सकते हैं:

douCoh.seekp(-1, std::ios_base::end); 

और रख डालने डेटा। जैसा कि अन्य ने कहा है, पहले स्थान पर खराब डेटा डालने से बचने का शायद आदर्श समाधान है, लेकिन मेरे मामले में तीसरे पक्ष के पुस्तकालय समारोह का नतीजा था, और मैं डेटा को स्ट्रिंग में कॉपी करने से बचना चाहता था।

संबंधित मुद्दे