

No.3ベストアンサー
- 回答日時:
外部コマンド実行のしっかりしたサポートがある言語を選ぶのがいいと思いますが、Cプログラム中から外部コマンドを呼び出したいというなら。
。。できるだけ、C言語から逸脱せずにやろうとすると、コマンド実行は system() 関数で実行できて、かつ、"> filename" をつけてコマンド結果をファイルにリダイレクトできることを仮定すれば、以下のような感じになりますかね。
あと、エラー処理などいっさいしていないことや、文字数の数え方を端折っていますので、適当に修正してください。
コマンド実行結果の格納に何文字いるかは、きっちりやろうと思えば、一度、fseek() などしないで、
・ファイルを実際読み込んでカウントし、rewind() するか、
・ファイルを読み込みながら、文字を格納している領域を拡張する
ということをします。ここでは、ファイルサイズよりは大きくならないだろう(たとえば、改行文字の変更などにより小さくはなっても大きくならない)と仮定してファイル位置から文字数を推定しています。
=====
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *execute(const char *cmd)
{
static char *cmdbuf = NULL;
static size_t bufsiz = 0;
static char fn[L_tmpnam];
const char *redirect = " > ";
size_t siz;
tmpnam(fn);
if ((siz = strlen(cmd) + strlen(redirect) + strlen(fn) + 1) > bufsiz)
cmdbuf = realloc(cmdbuf, bufsiz = siz);
strcpy(cmdbuf, cmd);
strcat(cmdbuf, redirect);
strcat(cmdbuf, fn);
system(cmdbuf);
return fn;
}
char *result(const char *fn)
{
long fsiz;
char *rv, *p, c;
FILE *fp = fopen(fn, "r");
fseek(fp, 0, SEEK_END);
fsiz = ftell(fp);
rv = p = malloc(fsiz + 1);
rewind(fp);
while ((c = getc(fp)) != EOF) *p++ = c;
*p = '\0';
fclose(fp);
remove(fn);
return rv;
}
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; ++i) {
char *str = result(execute(argv[i]));
printf("%s\n", str);
free(str);
}
}
===
Usage: program command1 command2 ...

No.5
- 回答日時:
もうひとつ訂正: main()の最後に
return 0;
をつけておいてください(C++ を書くほうが多いせいで、常に 0 を返す場合は、つい省略してしまう^^;)。
プログラム内で、エラーチェックを全然してないので、ほんとにエラーが起きていないかどうかはわかりませんが(笑)
この回答へのお礼
お礼日時:2007/08/30 00:35
丁寧に教えていただき、ありがとうございました。
参考にさせていただき、なんとか期待通り動くようになりました。
やはり、VBSとかケースバイケースで便利なものを使い分けられるように覚えなければいけませんね・・・
勉強します!

No.4
- 回答日時:
訂正:result() という関数内の
char *rv, *p, c;
を
char *rv, *p;
int c;
に修正しておいてください。たぶん、そのままでも動作すると思いますが、char が符号無しだったらまずいかも^^ 失礼しました。
No.2
- 回答日時:
その実行結果は標準出力に出てくるのでしょうか?
もしそうで、かつ「どんな言語」でも。というのなら
$result = `command`;
とかできちゃうPerlとかRubyがありますが。
C/C++ということなら、実行するコマンドと双方向でやりとりするのでなければ
popen が使えます。
Win32API でごりごりやるとか、Unixみたいに無名パイプをpipe()でつくって
とかでもいいですけど。
No.1
- 回答日時:
★アドバイス
・コマンドラインで実行した結果をファイルに保存。→リダイレクション機能。
その後プログラムから保存された実行結果のファイル内容を読み込めば利用は出来ます。
>C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか?
↑
fopen、fgets、fclose 関連を使って下さい。
・以上。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBプログラムから「管理者とし...
-
ACCESSでタイトルバーを非表示...
-
MacOS:ターミナルではNPMのコ...
-
eclipseからのターミナル実行方...
-
staticのメモリ共有について
-
ShellExecuteでDOSコマンド実行...
-
windowsのタスクスケジューラを...
-
SYSTEM関数等を用いて複数のコ...
-
Eclipseで、プロジェクト名のと...
-
正しいURL指定しているにもかか...
-
「ワークスペースをビルド中」...
-
tomcat起動時エラー
-
html上で、バッチやexeファイル...
-
Eclipse・プロジェクトで、フォ...
-
classファイルについて
-
JSPのクラスをコンパイルできな...
-
split関数で区切り文字がない場合
-
org.xml.sax.SAXParseException...
-
eclipseでのsvn認証エラー回避方法
-
LaTeXでのアンダーバーの入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBプログラムから「管理者とし...
-
MacOS:ターミナルではNPMのコ...
-
ACCESSでタイトルバーを非表示...
-
32bitアプリから64bitアプリの...
-
batよりjava起動
-
CloudSticky.jarが起動しない。
-
コマンドを実行してコマンドラ...
-
コマンドプロンプトの使い方
-
コマンドプロンプトが使えない
-
ShellExecuteの使い方について
-
VB6.0 ラベルが文字化け
-
実行したらがメモ帳出て来てしまう
-
staticのメモリ共有について
-
ACCESS VBA からエクセルを最小化
-
windowsのタスクスケジューラを...
-
jarファイルをバッチで実行させ...
-
javac のエラーメッセージについて
-
javaの中で環境変数を設定する。
-
FAT32→NTFS変換がうまくいきません
-
外部コマンドを実行する方法
おすすめ情報