No.1
- 回答日時:
★アドバイス
・コマンドラインで実行した結果をファイルに保存。→リダイレクション機能。
その後プログラムから保存された実行結果のファイル内容を読み込めば利用は出来ます。
>C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか?
↑
fopen、fgets、fclose 関連を使って下さい。
・以上。
No.2
- 回答日時:
その実行結果は標準出力に出てくるのでしょうか?
もしそうで、かつ「どんな言語」でも。というのなら
$result = `command`;
とかできちゃうPerlとかRubyがありますが。
C/C++ということなら、実行するコマンドと双方向でやりとりするのでなければ
popen が使えます。
Win32API でごりごりやるとか、Unixみたいに無名パイプをpipe()でつくって
とかでもいいですけど。
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.4
- 回答日時:
訂正:result() という関数内の
char *rv, *p, c;
を
char *rv, *p;
int c;
に修正しておいてください。たぶん、そのままでも動作すると思いますが、char が符号無しだったらまずいかも^^ 失礼しました。
No.5
- 回答日時:
もうひとつ訂正: main()の最後に
return 0;
をつけておいてください(C++ を書くほうが多いせいで、常に 0 を返す場合は、つい省略してしまう^^;)。
プログラム内で、エラーチェックを全然してないので、ほんとにエラーが起きていないかどうかはわかりませんが(笑)
この回答へのお礼
お礼日時:2007/08/30 00:35
丁寧に教えていただき、ありがとうございました。
参考にさせていただき、なんとか期待通り動くようになりました。
やはり、VBSとかケースバイケースで便利なものを使い分けられるように覚えなければいけませんね・・・
勉強します!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# C言語の質問です、プログラミング初心者です このような文字列があった場合 "abcdef☆ghijk 4 2022/11/22 10:56
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java 起動中のアプリケーショ...
-
ACCESS VBA からエクセルを最小化
-
コンパイルできるのに実行できない
-
VBプログラムから「管理者とし...
-
32bitアプリから64bitアプリの...
-
CloudSticky.jarが起動しない。
-
Java getRuntime().exec() で...
-
C# コマンドプロンプト画面で表...
-
MacOS:ターミナルではNPMのコ...
-
html上で、バッチやexeファイル...
-
Eclipseのアンインストールの仕方
-
Eclipseで、プロジェクト名のと...
-
マイクラjavaでForgeを入れたい...
-
eclipse実行ができない
-
正しいURL指定しているにもかか...
-
javaでuseBeanエラーの解決方法
-
vs codeはオフラインでも使用で...
-
eclipseのショトカットキー
-
Javascriptの値をJava(JSP)へ渡...
-
OptiFineをJAVAで開こうとする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSでタイトルバーを非表示...
-
VBプログラムから「管理者とし...
-
ShellExecuteの使い方について
-
MacOS:ターミナルではNPMのコ...
-
CloudSticky.jarが起動しない。
-
batよりjava起動
-
jarファイルをバッチで実行させ...
-
32bitアプリから64bitアプリの...
-
windows power shell icacl
-
staticのメモリ共有について
-
Java VM のヒープサイズについて
-
eclipseからのターミナル実行方...
-
ACCESS VBA からエクセルを最小化
-
SYSTEM関数等を用いて複数のコ...
-
VB6.0 ラベルが文字化け
-
「SimpleEntry を型に解決でき...
-
C#からバッチファイルを起動で
-
javaからバッチファイル実行
-
JAVAでログ出力するには?
-
コマンドを実行してコマンドラ...
おすすめ情報