Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年3月15日に更新

第2章64 外部コマンド実行

イチからゲーム作りで覚えるC言語
第2章63 自作ライブラリDLLを作る : PREV
NEXT : 第3章1 WindowsAPIを使う・sleep関数 :

概要

今回はC言語のプログラムから、外部のプログラムやコマンドを実行する system 関数について動作を確認していきます。

例えばファイルを圧縮・展開したり、テキストデータを編集したりなど、 すでに世の中にある様々な便利コマンドをプログラム内から呼び出したい時などに知っておくと、 非常に役に立つことがあります。

実行する

外部のプログラムを実行するための関数は system 関数で、stdlib.h ヘッダファイルををインクルードすることで 使うことができます。

使い方は下の通り。シンプルです。

system関数
int system( const char *実行したいコマンドの文字列 );

もし実行した外部コマンドが戻り値をもつなら、その悔過が system 関数の戻り値(int型)で得られます。

単純に外部のプログラムを実行するためには以下のようにプログラムを書くだけです。

 
system_ex1.c
int main () {
    system ( "dir" );
}

Windows 上の環境であれば、コマンド「dir」が実行されて下のような結果になりました。

実行結果
 ドライブ c のボリューム ラベルは Windows です
 ボリューム シリアル番号は B190-73E1 です

c:\c_0360_exec\src のディレクトリ

2021/03/14  06:28    <DIR>          .
2021/03/14  06:28    <DIR>          ..
2021/03/14  06:28            57,426 a.exe
2021/03/14  06:28                65 exec_ex.c
2021/03/14  06:27    <DIR>          testdir
               2 個のファイル              57,491 バイト
               3 個のディレクトリ  423,769,681,920 バイトの空き領域

実行した場所のファイルとフォルダの内容が表示されました。 コンソール上で「dir」と入力した時と同じ結果が標準出力(コンソール画面上)に表示されました。

外部コマンド実行時の引数

プログラムによっては、引数を指定できるものがあります。 「dir」コマンドについても、沢山の引数を指定することができ、フォルダの一覧を表示する条件や形式を変更できます。

今回はフルパスでフォルダの中身をすべて表示できるように「/w/s/b」という引数を指定して C言語から dir コマンドを実行してみます。

 
system_ex2.c
int main () {
    system ( "dir /w/s/b" );
}

実行すると下のような結果となりました。 ちゃんと、「dir /w/s/b」とコンソール上で実行した結果と同じ結果が表示されました。

実行結果
c:\c_0360_exec\src\a.exe
c:\c_0360_exec\src\exec_ex1.c
c:\c_0360_exec\src\exec_ex2.c
c:\c_0360_exec\src\testdir
c:\c_0360_exec\src\testdir\aaa.txt

補足:外部コマンドが標準出力した内容を読み込みたい

Linux や MacOS の環境であれば、popen 関数を使用して、 外部コマンドの結果を読み取ることができます。 しかし、Microsoft VisualStudio Community 環境では、popen 関数は衣装できません。

Microsoft 公式で、外部コマンドを実行した標準出力内容を 取得するサンプルコードが掲載されていますので、末尾の参考文献とここにリンクを掲載しておきます。

補足:ファイルを経由した外部コマンド結果取得

一次的にテキストファイルなどに、外部コマンドの結果を出力することで 外部コマンドの事項結果が手軽に確認できますので、こちらも参考としてコードを記載しておきます。

 
system_ex3.c
#include <stdio.h>
#include <stdlib.h>
int main () {
    system ( "dir /w/s/b > tempfile.txt" );
    FILE *fp;
    char buffer[2048];
    fp = fopen("tempfile.txt", "r");
    printf("dir /w/s/b 実行結果:\n");
    while (fgets(buffer, 2048, fp) != NULL) {
        printf(" ・%s", buffer);
    }
    fclose(fp);
}

実行結果は下の通りです。

実行結果
dir /w/s/b 実行結果:
 ・c:\c_0360_exec\src\a.exe
 ・c:\c_0360_exec\src\exec_ex1.c
 ・c:\c_0360_exec\src\exec_ex2.c
 ・c:\c_0360_exec\src\exec_ex3.c
 ・c:\c_0360_exec\src\testdir
 ・c:\c_0360_exec\src\testdir\aaa.txt

コマンドとして「dir /w/s/b > tempfile.txt」を動かすことで、 "dir /w/s/b" の実行結果を tempfile.txt ファイルに上書き保存しています。

この「>」はリダイレクトと呼ばれ、通常は画面(標準出力)に出力する内容を ファイルなどに出力することができます。

参考文献

イチからゲーム作りで覚えるC言語
第2章63 自作ライブラリDLLを作る : PREV
NEXT : 第3章1 WindowsAPIを使う・sleep関数 :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第4章3 C言語コンソール上で迷路脱出プログラム・迷路の自動生成

#C11仕様#C言語#ゲームプログラミング✎ 2021-05-15
C言語のコンソールゲームで迷路脱出ゲームプログラムの作り方を確認します。迷路は自動生成されます
広告領域
追従 広告領域
目次
第2章64 外部コマンド実行
第2章64 外部コマンド実行
概要
概要
実行する
実行する
外部コマンド実行時の引数
外部コマンド実行時の引数
補足:外部コマンドが標準出力した内容を読み込みたい
補足:外部コマンドが標準出力した内容を読み込みたい
補足:ファイルを経由した外部コマンド結果取得
補足:ファイルを経由した外部コマンド結果取得
参考文献
参考文献
Nodachisoft © 2021