파일 * 및 ISTREAM : 둘을 연결 하시겠습니까?
문제
내가 "Popen"을 실행 파일이라고 가정하면 FILE*
답례로. 또한이 파일을 "연결"하고 싶다고 가정합니다. istream
처리가 쉬운 개체는이 작업을 수행 할 수있는 방법이 있습니까?
해결책
표준 방법은 없지만 빠른 솔루션을 원한다면 fileno ()로 파일 디스크립터를 얻은 다음 Josuttis를 사용할 수 있습니다. FDSTREAM. 비슷한 노력이있을 수 있지만 먼 과거에 이것을 사용했고 잘 작동했습니다. 다른 것이 없다면 자신의 구현에 아주 좋은지도가되어야합니다.
다른 팁
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;
}
확실히 방법이 있습니다. 자신의 방법을 구현하십시오 istream
그것은 a로 구성 될 수 있습니다 FILE*
.
이 작업을 수행하는 표준 방법이 있는지 묻는다면 아니요.
제휴하지 않습니다 StackOverflow