假设我“POPEN”的可执行文件,我得到的回报一个FILE*
。此外,假设我想这个文件“连接”到istream
对象更容易处理,有没有办法做到这一点?FILE *和istream:连接两个?
8
A
回答
4
没有标准的方式,但如果你想有一个快速的解决方案,你可以得到的fileno()的文件描述符,然后使用约祖蒂斯fdstream。可能会有类似的努力,但我在遥远的过去使用它,它工作得很好。如果没有别的,它应该是一个非常好的地图来实现你自己的。
1
确实有办法,实施您自己的istream
,可以从FILE*
构建。
如果你问是否有做到这一点,那么没有一个标准的方式。
13
您可以通过派生的std :: basic_streambuf或std ::流缓冲类脱身。
沿着这些线:
#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. 使用istream和FILE运行getline的性能差异*
- 4. 连接两个ObjectDataSources
- 5. 连接两个行
- 6. 连接两个表
- 7. 连接两个dataframes
- 8. 连接两个表
- 9. 连接两个表
- 10. 连接两个表
- 11. 连接两个表
- 12. 连接两个表
- 13. 连接两个dataframes pyspark
- 14. 连接两个SQL表和分组
- 15. 连接两个表和考勤
- 16. 连接两个SQL查询和AND
- 17. Node.js - Chrome和Safari中的两个连接?
- 18. 使用左连接和两个条件
- 19. mysql:两个表的连接总和
- 20. 的Javascript连接两个JSON和比较
- 21. MySQL有两个连接和Where子句
- 22. 计数和连接两个表
- 23. 的MySQL:连接这两个表和
- 24. 只听两个连接websocketpp
- 25. Codeigniter根据两个连接条件连接两个表
- 26. 两个连接和两个计数得到laravel
- 27. Mysql的内连接两次,使用WHERE上两个连接
- 28. 连接两个Java流
- 29. MYSQL - 连接两个表
- 30. 连接两个表在MySQL
+1非常有用!做得好 :-) – jweyrich 2011-01-20 10:53:33