質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

2373閲覧

Visual Studio 2017(C#)での標準入力を利用したデバッグにてコンソール画面を閉じない

harupenang

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2018/03/11 04:04

Visual Studio 2017(Community)でC#でのサンプルを作ってます。
標準入力を利用したデバッグを行いたいと思い、

C#

1using System; 2 3namespace Test 4{ 5 class Section2 6 { 7 public static void Main() 8 { 9 string test = Console.ReadLine().Trim(); 10 Console.WriteLine(test); 11 12 Console.WriteLine("続行..."); 13 Console.ReadLine(); 14 System.Threading.Thread.Sleep(200); 15 16 } 17 } 18}

というコードで、プロジェクトプロパティ-「デバッグ」タブ-「開始オプション」-コマンドライン引数 に
< test.txt
として、このプロジェクトのデバッグ実行ファイルの出力先フォルダに置きました。
test.txtは以下になります。

text

11 2[EOF] 3

その上で、Visual Studio 2017の
「デバッグ」メニュー-「デバッグなしで開始」とすると、コマンドライン引数の設定は無視となりますが、
コマンドプロンプト画面で入力待ちとはなります。
→デバッグなしだから当然ですかね。

「デバッグ」メニュー-「デバッグの開始」とすると、コマンドプロンプト画面が表示され、

text

11 2続行...

と表示され、コマンドプロンプト画面は、そのまま閉じられてしまいます。
恐らく、2つのReadLineでも、標準入力から何らかの入力を受けとって先に処理が進んでいると思われるのですが..

標準出力をリダイレクトして結果を見るとかも考えられますが、できれば、
そのままコマンドプロンプト画面を閉じない方法で済ませられないかと思います。

以下のいずれかにアドバイス頂ければと思いますので、どうぞ宜しくお願いします。
・「デバッグなしで開始」でコマンドライン引数を指定する方法
・「デバッグの開始」で処理結果後、最後に入力待ちとなる方法

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/03/11 04:53

通常はデバッグ無しでもコマンドライン引数は有効です。そしてデバッグありでも ReadLine() を待ちます。何か特殊なことをしているなら追記してください。
harupenang

2018/03/11 05:05

ほぼ、デフォルトの設定で使っているつもりなので、特殊なことをしているつもりはありません。ただ、ファイルを標準入力で入れようとしているのが特殊といえば特殊なのかもしれません。デバッグありでReadLine()を待たないのは、ファイルからの入力待ちなので、その前にプログラム上で標準入力の切替をキーボード側にするとかしないと駄目な気がするのが回答指摘から感じました。
guest

回答4

0

もし目的が「プログラム終了直前に停止したい」ならば
Mainの最終行「}」にブレークポイントを設置してしまえばいいのではないかと思います。

投稿2018/03/11 10:47

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ローダーを作りましょう。

まずソリューションに新しいコンソールアプリのプロジェクトを追加します。
これを仮に ConsoleApp2 とします。
すでにあるものを仮に ConsoleApp1 とします。

ソリューションエクスプローラーで ConsoleApp2 を右クリックし、スタートアッププロジェクトに設定します。
ConsoleApp2 に ConsoleApp1 のプロジェクトの参照を追加します。

ConsoleApp1 の Program を public class にします。
ConsoleApp2 の Program.cs を次のようにします。

C#

1using System; 2using System.IO; 3 4namespace ConsoleApp2 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 var input = Console.In; 11 Console.SetIn(File.OpenText("input.txt")); 12 try 13 { 14 ConsoleApp1.Program.Main(args); 15 } 16 finally 17 { 18 Console.SetIn(input); 19 } 20 Console.ReadKey(); 21 } 22 } 23} 24

以上です。

投稿2018/03/11 07:05

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

harupenang

2018/03/11 09:32

この方法だと、ConsoleApp1側のコード部分をいじらずに対応できるかと思います。 Mainメソッドも、外部から呼び出せるメソッドですから当然ですよね。 コードもまで書いていただき、ありがとうございました。とても参考になります。
guest

0

何か質問者さんのやり方が変(それに伴い結果も変)なような気がするのですが?

プロジェクトプロパティ-「デバッグ」タブ-「開始オプション」-コマンドライン引数に < test.txt とすると、

というのは、標準入力(普通はキーボード)の代わりにテキストファイルから入力することになります。なので、テキストファイルを読み終わってしまうと Console.ReadLine(); ではキーボード入力を待たないという結果になっているのではないかと思います。

ただ、Visual Studio で[デバッグの開始]と[デバッグなしで開始]で実行させた場合の動きが、理由不明ですが、自分の環境(VS2015 Community)でも異なります。

[デバッグなしで開始]した場合、Visual Studio で 「開始オプション」-コマンドライン引数に設定した < test.txt はテキストファイル入力として認識されず "<" と "test.txt" という 2 つの文字列がコマンドライン引数として Main メソッドの引数 arg[] に渡されます。この場合は Console.ReadLine(); でキーボード入力を待ちます。

なので、とりあえずの回答としては、

・「デバッグなしで開始」でコマンドライン引数を指定する方法

コマンドライン引数を設定するということであれば xxx.exe < test.txt というようなテキストファイル入力ではなく(それをコマンドライン引数とは言わないと思うのですが)、普通に xxx.exe a b c とする。(Visual Studio の 「開始オプション」-コマンドライン引数には a b c と設定する)

・「デバッグの開始」で処理結果後、最後に入力待ちとなる方法

xxx.exe a b c とすれば[デバッグの開始]でも[デバッグなしで開始]でも Console.ReadLine() でキーボードからの入力待ちになるはずです。

投稿2018/03/11 06:22

編集2018/03/11 06:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

harupenang

2018/03/11 09:30

コメントありがとうございました。コマンドライン引数とリダイレクトによる標準入力の部分が不明瞭であったと思います。
退会済みユーザー

退会済みユーザー

2018/03/11 10:45

自分のレスはコメントではなくて回答だと思っているのですが・・・ それと、「不明瞭」という話ではなくて、単に質問者さんがコマンドライン引数というのは何か分かっていなかったということではないのですか?
guest

0

・「デバッグなしで開始」でコマンドライン引数を指定する方法

ビルドして生成された実行ファイルをコマンドプロンプトで実行すればコマンドライン引数を指定できます

・「デバッグの開始」で処理結果後、最後に入力待ちとなる方法

そのコードを、while(true)で囲いましょう

投稿2018/03/11 04:30

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

harupenang

2018/03/11 04:41

・「デバッグなしで開始」でコマンドライン引数を指定する方法 ビルドして生成された実行ファイルをコマンドプロンプトで実行すればコマンドライン引数を指定できます →VisualStudioの中で極力完結させられる方法がないかなと思っていたので、一つは了解です。 ・「デバッグの開始」で処理結果後、最後に入力待ちとなる方法 そのコードを、while(true)で囲いましょう →最後の入力待ちで、無限ループになっているようなので、キー入力は効かないようです。 コマンドプロンプト画面をXボタンで閉じる必要はありますが、一つの解決手段にはなりました。ありがとうございます。
y_waiwai

2018/03/11 04:43

main関数のナカミ全体を囲えばどうでしょう #なんかおかしなことになってそうな気もしますが
harupenang

2018/03/11 04:48

1を出力した後に、string test = Console.ReadLine().Trim();でSystem.NullReferenceException: が発生しました。なので、前の入力部分でwhile(true)が良い感じかもしれません。
y_waiwai

2018/03/11 04:55

あれ?入力はキーボードで行ってますか? #やっぱなんかおかしいことになってるよかん。
harupenang

2018/03/11 05:01

ああ、私の脳内がおかしかったですね。 テキストファイルを入力リダイレクトで標準入力しているので、キーボードから入力するなら、その前に標準入力をキーボードにするとか指示しないと駄目ですよね。 プログラム上で標準入力を切替られるか調べて考えてみます。
y_waiwai

2018/03/11 05:14

キーボードで入力を行っていれば、 元のコードのままで「処理結果後、最後に入力待ち」になっているはずです。
y_waiwai

2018/03/11 06:33

どうも、コマンドライン引数と、標準入力のリダイレクトがごっちゃになってるようですね。 > uniuni.exe < ahiahi.txt これは、リダイレクトといって、uniuni.exe における標準入力を ahiahi.txt に切り替えるという指定です。 実行の途中で標準入力の入力先を切り替えるというのは(通常は)できません。 なにをやりたいのか、というのをはっきりさせましょう
harupenang

2018/03/11 09:29

すみません、リダイレクトとかわかっていたのですが、VisualStudioの表記をそのまま書いて、伝わっていると思ってしまいました。 そして、通常の処理で実行途中で標準入力を変えられない点、了解です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問