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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2695閲覧

PowerShell & C++ データの受け渡しを実現させたい

former_neet_cat

総合スコア46

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/20 12:56

編集2020/09/20 13:48

データの受け渡しを実現させたい

C++ で作成した下記の2つのアプリケーションを PowerShell を使用してデータの受け渡しをしたいと考えています。
・StdOutC.exe 「ファイルを読み取りデータを出力させる」アプリケーション
・StdInC.exe 「データを受け取りデータを加工する」アプリケーション

PowerShell

1StdOutC.exe .¥test.txt | StdInC.exe

stdOutC.exe で test.txt から得た文字列をパイプラインに渡す部分と、
パイプラインから渡ってきた文字列を受け取る部分をどのようにコーディングすればいいのかわかりません。

該当のソースコード

StdOutC.exe

C++

1 2#include <iostream> 3#include <fstream> 4#include <string> 5#include <vector> 6 7using namespace std; 8 9vector<string> strptary_to_vec(int n, char* p[]) 10{ 11 vector<string> temp; 12 for (int i = 0; i < n; i++) 13 { 14 temp.push_back(p[i]); 15 } 16 17 return temp; 18} 19 20int main(int argc, char *argv[]) 21{ 22 // コマンドライン文字列を vector<string> に変換 23 vector<string> arg = strptary_to_vec(argc, argv); 24 25 // 第一引数は自身のファイル 26 if (argc <= 1) 27 { 28 cout << "引き数が足りません。 \n処理を終了します\n。"; 29 30 // 処理終了 31 return 0; 32 } 33 34 // 表示 35 // 第一引数は省略 36 for (vector<string>::size_type i = 1; i < arg.size(); i++) 37 { 38 cout << "[" << arg[i] << "] が読み込まれました。" << "\n"; 39 } 40 41 if (argc >= 3) 42 { 43 cout << "複数の読み込みを検知しました。\n先頭のファイルのみ処理を開始します。\n"; 44 } 45 46 // 先頭のファイルパスを読み込み 47 string path(arg.at(1)); 48 49 // ストリームライブラリの各クラスのコンストラクタをあわせるため 50 // string型ではなく const char* 型にしている 51 ifstream fis(path.c_str()); 52 53 // ファイルが開けるか確認 54 // 入力ストリームをオープン 55 if (fis.is_open()) 56 { 57 cout << "ファイルの存在を確認。\n処理を実行します。"; 58 59 // 入力ストリームをクローズ 60 fis.close(); 61 62 // 出力ストリームとしてファイルをオープン 63  // 「本当はパイプラインにデータを渡したい」 64 ofstream fos(path.c_str(), ios_base::app); 65 fos << "out file stream end !!"; 66 } 67 else 68 { 69 cout << "ファイルが存在しません。\n処理を終了します。"; 70 } 71 72} 73

StdInC.exe

C++

1 2#include <iostream> 3#include <fstream> 4#include <string> 5#include <vector> 6 7using namespace std; 8 9int main(int argc, char* argv[]) 10{ 11 12#if 1 // test 「本当ならパイプラインから得たデータを受け取りたい!!」 13 14 string folderPath("C:\Users\hoge\Desktop\PowerShellPractice\TESTF\"); 15 string fileName("test.txt"); 16 string path = folderPath + fileName; 17 18#endif 19 20 ifstream fis(path); 21 22 if (fis.is_open() == true) 23 { 24 string text; 25 26 while (true) 27 { 28 // 1行丸ごと 29 getline(fis, text); 30 31 // ストリームに失敗 (読み込めない場合) 32 if (fis.fail()) 33 { 34 // 読み込み終了 35 break; 36 } 37 38 cout << text << "\n"; 39 40 } 41 } 42 else 43 { 44 cout << "処理失敗\n"; 45 } 46 47 cout << "処理終了\n"; 48 49} 50 51

試したこと

ネットで検索をかけたり、書籍を読みましたが見つけることができませんでした。

補足情報(FW/ツールのバージョンなど)

開発環境 
Visual Studio 2017
PowerShell Core 7.1.0-preview.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問ポイントが今一分かりませんが、標準出力への出力方法と、標準入力からの入力方法でしょうか?

C++

1cout << text << endl; 23getline(cin, text);

で。

cout << "ファイルの存在を確認。\n処理を実行します。";

メッセージはcoutじゃなくてcerrに書きましょう。coutに書くとパイプに流れますので。

投稿2020/09/20 13:13

otn

総合スコア85901

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

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

former_neet_cat

2020/09/20 15:20

教えていただきありがとうございます。 恥ずかしい話、パイプラインと標準出力が結びついてなかったです。
otn

2020/09/20 15:44

ああ、そこですか。 コマンドラインでのパイプ「|」は、左側のコマンドの標準出力と、右側のコマンドの標準入力を繋ぎます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問