Visual C++ 2017 のIDEから実行するときにコマンドライン引数/作業ディレクトリ/出力先ファイルを指定する方法

Time-stamp: "2019-04-16 Tue 18:22 JST hig"

はじめに

瀬田学舎共通実習室の Windows にインストールされた Visual Studio 2017 で, プログラムをIDEから(デバッグの開始/デバッグなしで開始で)実行するときに, コマンドライン引数や作業ディレクトリを指定する方法です.

これを利用して, 標準入出力(scanf/printf)を指定のファイルにリダイレクトすることができます. 特に, 手動でcopy and pasteすることなしに, 出力をCSVファイルに保存することができます.

シンプルなやりかた

プロジェクトを選択しておいて, プロジェクト > (プロジェクト名の)プロパティ > 構成プロパティ>デバッグ で, 次のように設定します.

上の > は説明のためのかっこでなく, 実際に入力すべきキャラクタです. Linux の shell でリダイレクト a.out > ファイル名に使う記法と同じです. 前後の空白文字はあってもなくてもいいです.

区切り文字"\","円マークは"は, まあ「同じもの」です.

ここでQ:\csデスクトップ>PC>Qドライブ直下のフォルダcsで, あらかじめ作っておく必要があります, デバッグの/なしで開始すると, ファイルQ:\cs\my_output1.csvに実行結果(標準出力)が保存されます. つまり, Qドライブ直下のフォルダ csの中の my_output1.csv です. これをExcelなどで開けばいいのです.

my_output1.csvは自分で決めたファイル名です. 自分でわかる名前, または課題の指定の名前をつけてください. .csvは, 特定の書式のテキストファイルにつける拡張子で, comma separated values の略です.

ファイル名にはスペース(空白文字)や日本語を使わないでください.

自宅の環境ではQ:ドライブがないですが, ふだんの文書ディレクトリを指定するとスペースや日本語が含まれてしまうでしょう. Q:\cs のかわりに専用のディレクトリ C:\csを作ってはどうでしょう.

作業ディレクトリの設定は, (下とは違って)fopen に影響しません.

シンプルでない別のやり方

デバッグ開始/デバッグなしで実行することを考えます. プロジェクト > (プロジェクト名の)プロパティ > 構成プロパティ>デバッグ で,

プロパティ
コマンド引数 > rw0result1000.csv
作業ディレクトリ Q:\cs
として, 今まで通りに「デバッグなしで実行」します.

何が起きるの

こうすると, コマンドプロンプトからの実行で,

Q:\Visual Studio 2008\Projects>cd p000\Debug
Q:\Visual Studio 2008\Projects>p000\Debug>rw0 > Q:\cs\rw0result1000.csv
とするのと同じことになります.

仕組み

作業ディレクトリとは, あらかじめそのディレクトリに移動してから(カレントディレクトリにしてから)プログラムを実行するという設定です. これを指定すれば, コマンドライン引数で指定するのがそのディレクトリの中のファイルなら, ディレクトリ部分を省略することができます. fopen で指定するファイル名にも影響します

コマンドライン引数とは, コマンドプロンプトで, プログラム名(実行ファイル名)の後ろに書く文字列です. 上は, 標準出力のリダイレクト指定の例ですが, オプションや標準入力のリダイレクト指定を書くこともできます. 例えば

rw0 -o option 1 < 標準入力ファイル名 > 標準出力ファイル名

以下未検証です

ここで大注意なのですが, このファイル名には半角スペースが含まれていてはいけません. 出力をリダイレクトできません.指定されたファイルが無効です. というエラーになります. たとえダブルクォートで囲ったとしてもだめです. また逆に半角スペースを含んでいないファイル名でも, ダブルクォートで囲むとだめです. $(ProjectDir)などのマクロを使う場合,この値に半角スペースが含まれているとやはりだめです. つまりマクロ展開後の状態で判断されます.プロジェクトのディレクトリは,Q:\Visual Studio Projects\ProjectNameがデフォルトになっていますが,この中には入出力ファイルは置けないということです. 気をつけましょう.

このサイトのコンテンツ

QRcode to hig3.net

http://hig3.net