質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

2回答

3010閲覧

Qt(c++)でgnuplotを実行し、その出力結果を取得したい

nabla

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2021/11/23 04:31

編集2021/11/24 11:41

前提・実現したいこと

c++で_popenを用いてgnuplotを開き、fprintfでコマンドを送る。その際にgnuplot側での出力結果をc++で受け取りたい。

発生している問題・エラーメッセージ

今下記のコードでgnuplotを実行することはできています。

c++

1FILE *gp; 2 3gp = _popen("gnuplot.exe", "w"); 4fprintf(gp, "plot sin(x)\n"); 5fprintf(gp, "set terminal\n"); 6 7fflush(gp);

しかし、2つ目のコマンドやエラーメッセージの出力結果を受け取る方法が分かりません。本来set terminalを実行したら、利用可能な出力端末の一覧がgnuplotターミナルに出力されます。これをc++側でstring型などで受け取りたいです。開発環境(Qt)のアプリケーション出力には、gnuplotのコマンドの実行エラーや上記の出力がされています。

試したこと

調べたところ、_popenで外部コマンドの実行結果を受け取る方法としてfgets()が紹介されていました。それを試してみたのですが、書き込み指定の"w"では何も受け取らず、読み込み指定の"r"でパイプを開いても上手く実行されませんでした。

c++

1FILE *gp; 2 3gp = _popen("gnuplot.exe", "w"); 4fprintf(gp, "plot sin(x)\n"); 5fprintf(gp, "set terminal\n"); 6 7char buf[256]; 8while(fgets(buf, 256, gp) != NULL) { 9 printf("out : %s", buf); 10} 11 12fflush(gp);

_popenにwを指定した場合の出力結果。書き込み専用だから当然??

out : out : out : out : out : out : out : out : out : out : out : out : out : out : out : out :

_popenにrを指定した場合、gnuplotは起動せずアプリケーションも応答なし。

補足情報(FW/ツールのバージョンなど)

・開発環境 Qt Creator 6.2.0 MSVC2019 64bit
・コンパイラ Microsoft Visual C++ Compiler 16.10.31402.337(amd64)
・gnuplot version 5.2 patchlevel 8
具体的にはQt Creatorで作ったGUIアプリからボタンを押したらgnuplotが起動するようにしている。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

QtのQProcessを用いて解決しました。

c++

1QProcess *process = new QProcess(this); 2 3/* processから信号があれば実行されるようにラムダ式でconnect */ 4/* 標準出力 */ 5connect(process, &QProcess::readyReadStandardOutput, [process, this](){ 6 QString output = process->readAllStandardOutput(); //標準出力を受け取る 7 this->ui->textBrowser_output->insertPlainText(output); //出力内容をtextBrowserに表示 8 Debug() << output; 9}); 10/* 標準エラー */ 11connect(process, &QProcess::readyReadStandardError, [process, this](){ 12 QString err = process->readAllStandardError(); 13 this->ui->textBrowser_output->insertPlainText(err); 14 qDebug() << err; 15}); 16 17process->start("gnuplot.exe", QStringList() << "-persist"); //gnuplotを実行 18process->write("show terminal\n"); //コマンドを送る 19process->closeWriteChannel(); //書き込み終了

投稿2021/11/24 12:17

nabla

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Qt のアプリの中で _popen() をしている状況なのでしたら、
_popen() の代わりに Qt の API である QProcess を利用して gnuplot にデータの読み書きをするのという方法もありますね。

投稿2021/11/23 04:40

tasuku.

総合スコア347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nabla

2021/11/23 05:18

回答ありがとうございます。 QProcessを知りませんでした。使いやすくてこちらの方が適していると思いました。 まだ出力は受け取れてないのですが、また試行錯誤してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問