Visual C++ 2008 のIDEでプログラムを実行するときのコマンドライン引数/作業ディレクトリの指定, とくに標準入出力のリダイレクト

Time-stamp: "2014-06-03 Tue 14:21 JST hig"

はじめに

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

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

コマンドプロンプトからの引数つき実行と等価な設定

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

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

rw0result1000.csvは自分で決めたファイル名です. 自分でわかる名前を好きにつけてください. .csvは, こういう書式のテキストファイルによくつける拡張子で, comma separated values の略です.

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

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

何が起きるの

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

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

仕組み

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

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

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

別のやり方

以上の仕組みから,

プロパティ
作業ディレクトリ
コマンドライン引数 > Q:\cs2\rw0result1000.csv
も上と同じ効果を持ちます. ただし, fopen には影響がでません.

以下未検証です

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

このサイトのコンテンツ

QRcode to hig3.net

https://hig3.net