C++ 在c+中使用popen+;并将它们存储在动态大小的字符数组中

C++ 在c+中使用popen+;并将它们存储在动态大小的字符数组中,c++,unix,C++,Unix,我试图用C++中的POPON执行shell命令。p> FILE *ls_cmd = popen("command","r"); if (ls_cmd == NULL) { fprintf(stderr, "popen(3) error"); exit(EXIT_FAILURE); } **static char buff

我试图用C++中的POPON执行shell命令。p>
FILE *ls_cmd = popen("command","r");
                if (ls_cmd == NULL) {
                    fprintf(stderr, "popen(3) error");
                    exit(EXIT_FAILURE);
                }

                **static char buff[1064];**
                size_t n;

                while ((n = fread(buff, 1, sizeof(buff)-1, ls_cmd)) > 0) {
                    buff[n] = '\0';

                }
因为,我没有优先考虑命令返回的结果,如果返回的结果非常大,我无法将所有结果存储在buff中,因为我已经静态地为我的char数组分配了1024个内存

如何动态地分配、重新分配我的char buff[]数组,使我的buff[]不会遗漏执行shell命令的popen命令返回的任何值


如果有任何帮助,我们将不胜感激。

对于您的问题,您应该使用c++风格的内存管理。因此,您可以使用
std::vector
来分配、重新分配和释放内存片段。下面是一个例子

FILE *ls_cmd = popen("ls ~","r");
if (ls_cmd == NULL) {
    fprintf(stderr, "popen(3) error");
    exit(EXIT_FAILURE);
}

std::vector<uint8_t> buff;
const std::size_t delta = 1024;
std::size_t cursor = 0;
buff.resize(delta);

std::size_t n;

while ((n = fread(buff.data()+cursor, 1, buff.size()-cursor, ls_cmd)) > 0) {
    cursor += n;
    if (cursor == buff.size()){
        if (buff.capacity() == buff.size()){
            buff.reserve(buff.size() + delta);
        }
        buff.resize(buff.capacity());
    }
}
buff[cursor] = '\0';
buff.resize(cursor+1);

只要你把你的问题标记为
c++
,你就应该使用c++风格的内存管理。因此,您可以使用
std::vector
来分配、重新分配和释放内存片段。下面是一个例子

FILE *ls_cmd = popen("ls ~","r");
if (ls_cmd == NULL) {
    fprintf(stderr, "popen(3) error");
    exit(EXIT_FAILURE);
}

std::vector<uint8_t> buff;
const std::size_t delta = 1024;
std::size_t cursor = 0;
buff.resize(delta);

std::size_t n;

while ((n = fread(buff.data()+cursor, 1, buff.size()-cursor, ls_cmd)) > 0) {
    cursor += n;
    if (cursor == buff.size()){
        if (buff.capacity() == buff.size()){
            buff.reserve(buff.size() + delta);
        }
        buff.resize(buff.capacity());
    }
}
buff[cursor] = '\0';
buff.resize(cursor+1);

对上一个答案的简短评论: 如果你要做

std::string cpp_string(buff.begin(), buff.end());
那最好还是放弃

buff[cursor] = '\0';
buff.resize(cursor+1);
而是写

buff.resize(cursor);

要避免在您的
cpp\u字符串中出现不必要的
'\0'
,请对上一个答案进行简短评论: 如果你要做

std::string cpp_string(buff.begin(), buff.end());
那最好还是放弃

buff[cursor] = '\0';
buff.resize(cursor+1);
而是写

buff.resize(cursor);

为了避免在
cpp\u字符串中出现不必要的
'\0'

错误,buff.resize()会给我一个内存错误,因为它会消耗堆栈空间来构造每个新对象。@Heggy,buff.resize()不会占用堆栈,它会在堆中分配新的内存块并将数据复制到那里。显示您的代码。我的代码在我的机器上运行得很好。我使用了一个向量buff,它给了我内存错误。我将其更改为使用向量buff,然后将其类型转换为string。工作完美。谢谢你,伙计@Heggy,我更新了答案,以说明如何使用结果缓冲区作为
char*
std::string
(如果需要)。需要更多
const
buff.resize()会给我一个内存错误,因为它会消耗堆栈空间来构造每个新对象。@Heggy,buff.resize()不会占用堆栈,它在堆中分配新的内存块并在那里复制数据。显示您的代码。我的代码在我的机器上运行得很好。我使用了一个向量buff,它给了我内存错误。我将其更改为使用向量buff,然后将其类型转换为string。工作完美。谢谢你,伙计@Heggy,我更新了答案以显示如何使用结果缓冲区,如有需要,可以使用
char*
std::string
。需要更多
const