2012-11-27 25 views
7

से ifstream का उपयोग करें मेरे पास कुछ कोड है जो फ़ाइल से कुछ डेटा पढ़ने के लिए ifstream का उपयोग करता है और सबकुछ काम करता है।सी ++ मेमोरी

अब मैं चाहता हूँ, कुछ कोड को संशोधित करने के बिना, एक स्मृति से इस डेटा को प्रभावी ढंग से पढ़ने के बिना पढ़ा है, वास्तव में मैं एक char * कि डेटा होता है ...

कैसे मैं एक ifstream में मेरी char * डेटा डाल सकते है फाइल?

+0

संभावित डुप्लिकेट [मानक स्ट्रीम (पबेटबफ) द्वारा उपयोग किए जाने वाले आंतरिक बफर को सेट करना] (http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a- मानक- स्ट्रीम-pubsetbuf) –

उत्तर

7

कोड ifstream& का उपयोग करता है तो एक istream& उपयोग करने के लिए थोड़ा बदला जा सकता है, तो आप आसानी से (स्मृति से डाटा पढ़ने में) ifstream और istringstream के बीच स्विच कर सकते हैं:

void read_data(std::istream& in) 
{ 
} 

कॉलर्स:

std::istringstream in_stream(std::string("hello")); 
read_data(in_stream); 

std::ifstream in_file("file.txt"); 
read_data(in_file); 
8

मानक पुस्तकालय प्रदान करता है एक में स्मृति istream भी लिखने योग्य है कि: std::stringstream

आप इतना है कि यह एक ifstream के बजाय एक सामान्य istream स्वीकार करता है करने के लिए ठीक से सार अपने कोड की जरूरत है, एक stringstream का निर्माण, अपने डेटा से पॉप्युलेट और कार्य करने के लिए है कि गुजरती हैं।

उदाहरण के लिए:

const char* data = "Hello world"; 
std::stringstream str((std::string(data))); // all the parens are needed, 
              // google "most vexing parse" 

do_something_with_istream(str); // pass stream to your code 
1

आप स्ट्रिंगस्ट्रीम की खोज कर रहे हैं। http://www.cplusplus.com/reference/sstream/stringstream/। मैंने केवल एक बार पहले उपयोग किया है और यह एक लंबा समय रहा है, लेकिन मूल रूप से आप स्मृति में किसी स्थान से स्ट्रीम कर सकते हैं।

6

हालांकि std::istringstream के उपयोग (कभी कभी erronously प्रमुख i साथ करने के लिए भेजा; भी इस तरह के एक वर्ग मरता मौजूद हैं,, लेकिन निर्माण करने के लिए के रूप में यह भी एक निर्गम धारा सेट अधिक महंगा है) बहुत लोकप्रिय है, मुझे लगता है कि इसके लायक है यह इंगित करते हुए कि यह कम से कम, वास्तविक स्ट्रिंग की एक प्रति बनाता है (मुझे संदेह होगा कि अधिकांश कार्यान्वयन दो प्रतियां भी बनाते हैं)। भी

struct membuf: std::streambuf { 
    membuf(char* base, std::ptrdiff_t n) { 
     this->setg(base, base, base + n); 
    } 
}; 
membuf sbuf(base, n); 
std::istream in(&sbuf); 

स्मृति अंतर कोई फर्क नहीं सकता है, हालांकि बचाया आवंटन वहाँ उल्लेखनीय हो सकता है की एक छोटे से क्षेत्र के लिए: किसी भी प्रति बनाई जा रही एक छोटी सी धारा बफर का उपयोग कर बचा जा सकता है। स्मृति के बड़े हिस्से के लिए यह एक बड़ा अंतर बनाता है।

0

मेरी प्रोजेक्ट में मैं लिखने() और iostream के तरीकों को पढ़ता हूं, क्योंकि मैं स्ट्रिंगस्ट्रीम में बाइनरी डेटा लिखता हूं। क्षमा करें, निम्न कोड परीक्षण किया जाता है नहीं है और शायद वाक्यविन्यास त्रुटियों (कार्यालय से टाइपिंग है ... ;-), लेकिन कुछ इस तरह आप स्मृति, फ़ाइलों को लिखने और अन्य जगहों के लिए अनुमति देता है (जैसे नेटवर्क सॉकेट):

void foo(std::iostream *mystream) 
{ 
    mystream.write("Hello", 5); 
    uint32_t i=5302523; 
    mystream.write((char*) &i, sizeof i); 
} 

int main() 
{ 
    // Write to memory. stringstream's write() and read() work binary 
    std::stringstream memstream; 
    foo(&memstream); 

    // Write to file 
    std::fstream f; 
    try 
    { 
     f.open("file.dat"); 
     foo(&f); 
    } 
    catch (...) 
    { 
     // ... 
    } 

    if (f.is_open()) 
     f.close(); 

    return EXIT_SUCCESS; 
}