실행 파일을 "popen"한다고 가정하면, 나는 FILE*
을 얻게됩니다. 또한이 파일을 istream
객체에 "연결"하여보다 쉽게 처리 할 수 있다고 가정 할 때이 방법이 있습니까?FILE * 및 istream : 둘을 연결 하시겠습니까?
8
A
답변
4
표준 방법은 없지만 빠른 해결책을 원하면 fileno()를 사용하여 파일 설명자를 얻은 다음 Josuttis의 fdstream을 사용할 수 있습니다. 비슷한 노력이있을 수 있지만 나는 먼 과거에 이것을 사용했고 그것은 잘 동작했다. 아무것도 없다면 자신 만의지도를 구현할 수있는 아주 좋은지도 여야합니다.
1
확실한 방법이 있습니다. FILE*
에서 생성 할 수있는 자신의 istream
을 구현하십시오.
표준 방법이 있는지 묻는다면, 아니오.
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. istream get 문자 버퍼를 구현 하시겠습니까?
- 2. istream C++
- 3. istream 연산자
- 4. 깨끗한 방법으로 File :: Temp 파일을 연결 해제 하시겠습니까?
- 5. file()을 점진적으로 사용 하시겠습니까?
- 6. istream get 메서드 동작
- 7. IStream 개체에 데이터 추가
- 8. std :: istream :: 효율을 얻으십시오
- 9. IE9 및 "file : ///"앵커
- 10. ftp : // 및 file : //
- 11. 여러 문자열을 연결 하시겠습니까?
- 12. 매개 변수없이 istream :: get()이 공백을 반환합니까?
- 13. 연결 거부 및 연결 시간 제한을 구분합니다.
- 14. jQuery translate + toggle, 둘을 연결하는 방법?
- 15. asp.net 연결 풀링 : 자동으로 연결 테스트 및 검증 하시겠습니까?
- 16. Windows를 사용하여 파일 다운로드 IStream
- 17. UrlMappings에서 문자열을 연결 하시겠습니까?
- 18. FILE *
- 19. 파일 나열 및 연결
- 20. Delphi에서 SQL Azure에 연결 하시겠습니까?
- 21. TR1을 우분투에 연결 하시겠습니까?
- 22. SOTAMAS90 ODBC에 연결 하시겠습니까?
- 23. ServiceContract에 연결 하시겠습니까?
- 24. Winsock을 정적으로 연결 하시겠습니까?
- 25. MySQL과 qt를 연결 하시겠습니까?
- 26. /checkout 페이지로 연결 하시겠습니까?
- 27. 어떻게 자동으로 연결 하시겠습니까?
- 28. Qt 창을 연결 하시겠습니까?
- 29. Android 서비스에 연결 하시겠습니까?
- 30. 원격으로 mysql에 연결 하시겠습니까?
+1 매우 유용합니다! 잘 했어 :-) – jweyrich