मान लीजिए कि मैं निष्पादन योग्य "पॉपन" करता हूं, मुझे बदले में FILE*
मिलता है। इसके अलावा, मान लीजिए कि मैं इस फ़ाइल को istream
ऑब्जेक्ट को आसान प्रसंस्करण के लिए "कनेक्ट" करना चाहता हूं, क्या ऐसा करने का कोई तरीका है?फ़ाइल * और आईट्रीम: दो कनेक्ट करें?
8
A
उत्तर
4
कोई मानक तरीका नहीं है लेकिन यदि आप त्वरित समाधान चाहते हैं तो आप fileno() के साथ फाइल डिस्क्रिप्टर प्राप्त कर सकते हैं और फिर जोसुटिस 'fdstream का उपयोग कर सकते हैं। आसपास के समान प्रयास हो सकते हैं लेकिन मैंने इसे दूर के अतीत में उपयोग किया और यह ठीक काम किया। यदि कुछ और नहीं है तो यह स्वयं को लागू करने के लिए एक बहुत अच्छा मानचित्र होना चाहिए।
1
निश्चित रूप से एक तरीका है, अपना istream
लागू करें जिसे FILE*
से बनाया जा सकता है।
यदि आप पूछ रहे हैं कि ऐसा करने का कोई मानक तरीका है, तो नहीं।
13
आप std :: basic_streambuf या std :: streambuf कक्षाओं को प्राप्त करके दूर हो सकते हैं।
इन पंक्तियों के साथ कुछ:
#include <stdio.h>
#include <iostream>
#define BUFFER_SIZE 1024
class popen_streambuf : public std::streambuf {
public:
popen_streambuf() : fp(NULL) {
}
~popen_streambuf() {
close();
}
popen_streambuf *open(const char *command, const char *mode) {
fp = popen(command, mode);
if (fp == NULL)
return NULL;
buffer = new char_type[BUFFER_SIZE];
// It's good to check because exceptions can be disabled
if (buffer == NULL) {
close();
return NULL;
}
setg(buffer, buffer, buffer);
return this;
}
void close() {
if (fp != NULL) {
pclose(fp);
fp = NULL;
}
}
std::streamsize xsgetn(char_type *ptr, std::streamsize n) {
std::streamsize got = showmanyc();
if (n <= got) {
memcpy(ptr, gptr(), n * sizeof(char_type));
gbump(n);
return n;
}
memcpy(ptr, gptr(), got * sizeof(char_type));
gbump(got);
if (traits_type::eof() == underflow()) {
return got;
}
return (got + xsgetn(ptr + got, n - got));
}
int_type underflow() {
if (gptr() == 0) {
return traits_type::eof();
}
if (gptr() < egptr()) {
return traits_type::to_int_type(*gptr());
}
size_t len = fread(eback(), sizeof(char_type), BUFFER_SIZE, fp);
setg(eback(), eback(), eback() + (sizeof(char_type) * len));
if (0 == len) {
return traits_type::eof();
}
return traits_type::to_int_type(*gptr());
}
std::streamsize showmanyc() {
if (gptr() == 0) {
return 0;
}
if (gptr() < egptr()) {
return egptr() - gptr();
}
return 0;
}
private:
FILE *fp;
char_type *buffer;
};
int main(int argc, char *argv)
{
char c;
popen_streambuf sb;
std::istream is(&sb);
if (NULL == sb.open("ls -la", "r")) {
return 1;
}
while (is.read(&c, 1)) {
std::cout << c;
}
return 0;
}
संबंधित मुद्दे
- 1. दो डेटाबेस से कनेक्ट करें
- 2. आईट्रीम बनाम स्मृति एक फ़ाइल मैपिंग?
- 3. एंड्रॉइड: वायरलेस रूप से दो फोन कनेक्ट करें?
- 4. websockets के साथ दो node.js सर्वर को कैसे कनेक्ट करें?
- 5. एक साथ दो वायरलेस नेटवर्क से एंड्रॉइड कनेक्ट करें
- 6. कनेक्ट और एक्सप्रेस utils
- 7. कनेक्ट 2 और सॉकेट.io
- 8. एक्सप्रेसज/कनेक्ट - धीमी फ़ाइल अपलोड को अनुकरण करें
- 9. क्या socket.io फिर से कनेक्ट कनेक्ट कनेक्ट करता है?
- 10. ओपनिड कनेक्ट और स्प्रिंग सिक्योरिटी
- 11. एक्सेल दो कॉलम की तुलना करें और
- 12. फ़ाइल-आधारित डर्बी डेटाबेस से कनेक्ट
- 13. दो प्रक्रियाओं शुरू और डेल्फी
- 14. कनेक्ट
- 15. दो फ़ाइल डिस्क्रिप्टर एक ही फ़ाइल में
- 16. Xcode सत्यापित करें iTunes कनेक्ट
- 17. लाइन से दो फाइलों की तुलना करें और दूसरी फ़ाइल में अंतर उत्पन्न करें
- 18. सॉकेट आईओ दोबारा कनेक्ट करें?
- 19. सी ++ दोस्त फ़ंक्शन - ऑपरेटर ओवरलोडिंग आईट्रीम >>
- 20. फेसबुक-कनेक्ट डेमो - "कॉलबैक यूआरएल" == "कॉलबैक यूआरएल कनेक्ट करें"?
- 21. ओपनआईडी और एफबी कनेक्ट ट्यूटोरियल
- 22. सशर्त रूप से डेटाबेस से कनेक्ट करें
- 23. एन * (कनेक्ट + भेजें + बंद करें) बनाम (नागल अक्षम + कनेक्ट + एन * भेजें + बंद करें), एन> 1
- 24. .mobileprovision फ़ाइल और .app फ़ाइल कैसे प्राप्त करें
- 25. दो छवियों की तुलना करें, और%
- 26. LINQ दो सूचियों की तुलना करें और
- 27. बूलियन और दो दृश्यता कन्वर्टर्स कैसे करें
- 28. पायथन स्क्रिप्ट - एसएसएच से कनेक्ट करें और रन कमांड
- 29. यूएसबी डिवाइस को प्रोग्रामेटिक रूप से कनेक्ट और डिस्कनेक्ट करें
- 30. यूएसबी डिवाइस को प्रोग्रामेटिक कनेक्ट और रीकनेक्ट कैसे करें
+1 काफी उपयोगी! बहुत बढ़िया :-) – jweyrich