gpt4 book ai didi

c++ - 文件 * 和 istream : connect the two?

转载 作者:IT王子 更新时间:2023-10-29 00:17:08 26 4
gpt4 key购买 nike

假设我“popen”了一个可执行文件,我得到了一个 FILE* 作为返回。此外,假设我想将此文件“连接”到 istream 对象以便于处理,有没有办法做到这一点?

最佳答案

您可以通过派生 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;
}

关于c++ - 文件 * 和 istream : connect the two?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com