gpt4 book ai didi

c++ - 如何读取 C++ 中 system() 调用的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:13:58 27 4
gpt4 key购买 nike

我正在使用以下代码尝试在 Linux 中使用 popen 读取 df 命令的结果。

#include <iostream> // file and std I/O functions

int main(int argc, char** argv) {
FILE* fp;
char * buffer;
long bufSize;
size_t ret_code;

fp = popen("df", "r");
if(fp == NULL) { // head off errors reading the results
std::cerr << "Could not execute command: df" << std::endl;
exit(1);
}

// get the size of the results
fseek(fp, 0, SEEK_END);
bufSize = ftell(fp);
rewind(fp);

// allocate the memory to contain the results
buffer = (char*)malloc( sizeof(char) * bufSize );
if(buffer == NULL) {
std::cerr << "Memory error." << std::endl;
exit(2);
}

// read the results into the buffer
ret_code = fread(buffer, 1, sizeof(buffer), fp);
if(ret_code != bufSize) {
std::cerr << "Error reading output." << std::endl;
exit(3);
}

// print the results
std::cout << buffer << std::endl;

// clean up
pclose(fp);
free(buffer);
return (EXIT_SUCCESS);
}

这段代码给我一个“内存错误”,退出状态为“2”,所以我可以看到哪里它失败了,我只是不明白为什么.

我根据在 Ubuntu Forums 上找到的示例代码将其组合在一起和 C++ Reference ,所以我没有嫁给它。如果有人可以建议一种更好的方法来读取 system() 调用的结果,我乐于接受新想法。

编辑原文: 好的,bufSize 为负数,现在我明白为什么了。您不能像我天真地尝试那样随机访问管道。

我不可能是第一个尝试这样做的人。有人可以给出(或指出)一个示例,说明如何在 C++ 中将 system() 调用的结果读取到变量中吗?

最佳答案

你让这一切变得太难了。 popen(3) 返回标准管道文件的常规旧 FILE *,也就是说,换行符终止的记录。您可以像在 C 中那样使用 fgets(3) 以非常高的效率读取它:

#include <stdio.h>
char bfr[BUFSIZ] ;
FILE * fp;
// ...
if((fp=popen("/bin/df", "r")) ==NULL) {
// error processing and return
}
// ...
while(fgets(bfr,BUFSIZ,fp) != NULL){
// process a line
}

在 C++ 中甚至更容易 --

#include <cstdio>
#include <iostream>
#include <string>

FILE * fp ;

if((fp= popen("/bin/df","r")) == NULL) {
// error processing and exit
}

ifstream ins(fileno(fp)); // ifstream ctor using a file descriptor

string s;
while (! ins.eof()){
getline(ins,s);
// do something
}

那里有一些更多的错误处理,但就是这样。重点是你对待来自 popenFILE * 就像 any FILE * 一样,并逐行读取行。

关于c++ - 如何读取 C++ 中 system() 调用的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309491/

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