0

次の出力を作成する C++ プログラム内から LINUX コマンドを呼び出しています。出力の最初の列を C++ 変数 (long int など) にコピーする必要があります。どうすればできますか?? それが不可能な場合、この結果を作業可能な .txt ファイルにコピーするにはどうすればよいですか?

編集

          0 +0
 2361294848 +2361294848
 2411626496 +50331648
 2545844224 +134217728
 2713616384 +167772160

これをファイルfile.txtとして保存し、次のコードを使用して左の列を0なしで抽出し、整数で保存しています

string stringy="";
int can_can=0;
for(i=begin;i<length;i++)
{
if (buffer[i]==' ' && can_can ==1) //**buffer** is the whole text file read in char*
{
num=atoi(stringy.c_str());
array[univ]=num; // This where I store the values.
univ+=1;
can_can=1;
  }
  else if (buffer[i]==' ' && can_can ==0) 
 {
stringy="";  
}
else if (buffer[i]=='+')
{can_can=0;}
else{stringy.append(buffer[i]);}
}

これでセグメンテーション エラーが発生します。何ができますか?

前もって感謝します。

4

4 に答える 4

3

popen()の周りに単純なstreambufラッパーを作成するだけです

#include <iostream>
#include <stdio.h>

struct SimpleBuffer: public std::streambuf
{   
    typedef std::streambuf::traits_type traits;
    typedef traits::int_type            int_type;

    SimpleBuffer(std::string const& command)
        : stream(popen(command.c_str(), "r"))
    {   
        this->setg(&c[0], &c[0], &c[0]);
        this->setp(0, 0); 
    }   
    ~SimpleBuffer()
    {   
        if (stream != NULL)
        {   
            fclose(stream);
        }   
    }   
    virtual int_type underflow()
    {   
        std::size_t size = fread(c, 1, 100, stream);
        this->setg(&c[0], &c[0], &c[size]);

        return size == 0 ? EOF : *c; 
    }   

    private:
        FILE*   stream;
        char    c[100];

};  

使用法:

int main()
{
    SimpleBuffer    buffer("echo 55 hi there Loki");
    std::istream    command(&buffer);

    int  value;
    command >> value;

    std::string line;
    std::getline(command, line);

    std::cout << "Got int(" << value << ") String (" << line << ")\n";
}

結果:

> ./a.out
Got int(55) String ( hi there Loki)
于 2012-09-11T22:24:05.170 に答える
1

それはpopenおそらくあなたが探しているものです。試す

man popen

.

または、次の小さな例を参照してください。

#include <iostream>
#include <stdio.h>

using namespace std;

int main() 
{

    FILE *in;
    char buff[512];

    if(!(in = popen("my_script_from_command_line", "r"))){
        return 1;
    }

    while(fgets(buff, sizeof(buff), in)!=NULL){
          cout << buff; // here you have each line 
                        // of the output of your script in buff
    }
    pclose(in);

    return 0;
}
于 2012-09-11T19:03:12.837 に答える
0

You probably want to use popen to execute the command. This will give you a FILE * that you can read its output from. From there, you can parse out the first number with (for example) something like:

fscanf(inpipe, "%d %*d", &first_num);

which, just like when reading from a file, you'll normally repeat until you receive an end of file indication, such as:

long total = 0;

while (1 == fscanf(inpipe, "%l %*d", &first_num))
    total = first_num;

printf("%l\n", total);
于 2012-09-11T19:04:13.800 に答える
0

Unfortunately, it’s not easy since the platform API is written for C. The following is a simple working example:

#include <cstdio>
#include <iostream>

int main() {
    char const* command = "ls -l";

    FILE* fpipe = popen(command, "r");

    if (not fpipe) {
        std::cerr << "Unable to execute commmand\n";
        return EXIT_FAILURE;
    }

    char buffer[256];
    while (std::fgets(buffer, sizeof buffer, fpipe)) {
        std::cout << buffer;
    }

    pclose(fpipe);
}

However, I’d suggest wrapping the FILE* handle in a RAII class to take care of resource management.

于 2012-09-11T19:04:57.340 に答える