VisualStudioで、実行画面をテキストで保存する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ghffmj
記事: 14
登録日時: 7年前

VisualStudioで、実行画面をテキストで保存する方法

#1

投稿記事 by ghffmj » 7年前

Visual Studio2010を使って、C++のプログラムを作成しています。

coutで値を出力しているのですが、これを簡単に自動的にテキストに掃き出すようにできないでしょうか。
ofstreamを使えばできますが、毎回coutしているところにofstreamをやるのは非常に面倒なので、簡単に、コマンドプロンプトに表示されたものを全てテキストに保存できる方法があれば教えていただきたいです。

よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: VisualStudioで、実行画面をテキストで保存する方法

#2

投稿記事 by h2so5 » 7年前

printfやscanf、std::coutなどの入出力先をファイルに変更する
http://www.programming-magic.com/20100916205128/

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: VisualStudioで、実行画面をテキストで保存する方法

#3

投稿記事 by softya(ソフト屋) » 7年前

リダイレクトすれば保存できます。
hozon.txtに保存するとして

コマンドプロンプトなら
実行ファイル名 > hozon.txt

Visual Studio上からなら、
プロジェクトのプロパティ → デバッグ → コマンド引数に > hozon.txt と入力。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ghffmj
記事: 14
登録日時: 7年前

Re: VisualStudioで、実行画面をテキストで保存する方法

#4

投稿記事 by ghffmj » 7年前

h2so5 さん、ありがとうございます。このような方法もあるのですね。
softyaさん、このような方法を探していました。ただ、画面上にも表示して、かつtxtにも保存したいのです。
これだと、画面上には何も表示されませんでした。

何か方法はあるでしょうか。よろしくお願い致します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: VisualStudioで、実行画面をテキストで保存する方法

#5

投稿記事 by softya(ソフト屋) » 7年前

Linuxならteeコマンドをパイプすれば出来ますがWindowsは標準ではないようです。

「Windowsでteeを使いたくて: MSLabo: MCP取得や実務用に自宅でWindowsサーバを検証・自習してます&たまに日記」
http://mslabo.blog45.fc2.com/blog-entry-234.html

system32にコピーするのはオススメしません。何処かにフォルダを作って環境パスを通してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 8年前

Re: VisualStudioで、実行画面をテキストで保存する方法

#6

投稿記事 by nil » 7年前

参考:猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/cpp/cpp_01.htm

コード:

~.exe > out.txt
~.exe
のようなバッチファイルを作るのも手です

ghffmj
記事: 14
登録日時: 7年前

Re: VisualStudioで、実行画面をテキストで保存する方法

#7

投稿記事 by ghffmj » 7年前

>softyaさん
ありがとうございます。teeコマンドをコマンド引数に指定してみると、確かに両方に表示されましたが、リアルタイムで表示されなく、プログラムの実行が終わってやっと表示してくれるという風になりました。リアルタイムに表示して貰わないと困るのですが、、、何かいい方法がありますでしょうか。

>涼雅さん
すみません。バッチについての知識を持っていないのですが、これを使えばVisualStudioでプログラムを実行するだけで、コマンドプロンプトとファイルの両方に出力してくれるのでしょうか。

nil
記事: 428
登録日時: 8年前

Re: VisualStudioで、実行画面をテキストで保存する方法

#8

投稿記事 by nil » 7年前

>これを使えばVisualStudioでプログラムを実行するだけで、コマンドプロンプトとファイルの両方に出力してくれるのでしょうか。
それは無理ですが、
[codetxt]
Debug/~.exe > out.txt
Debug/~.exe
[/code]
もしくは
[codetxt]
Release/~.exe > out.txt
Release/~.exe
[/code]
として、slnファイルのある場所に保存すれば、
ファイルとコンソール両方に出力されるかと思います。
但し、これは一度~.exeを実行したあとにもう一度~.exeを起動するものなので、
リアルタイムというのはできませんし、
cinなどでの入力が必要なプログラムであれば2度入力をしなければなりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: VisualStudioで、実行画面をテキストで保存する方法

#9

投稿記事 by softya(ソフト屋) » 7年前

ghffmj さんが書きました:>softyaさん
ありがとうございます。teeコマンドをコマンド引数に指定してみると、確かに両方に表示されましたが、リアルタイムで表示されなく、プログラムの実行が終わってやっと表示してくれるという風になりました。リアルタイムに表示して貰わないと困るのですが、、、何かいい方法がありますでしょうか。
コマンドラインの仕組みなので、それは出来ないです。
やはり、プログラムから同時にファイル出力をするしか無いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: VisualStudioで、実行画面をテキストで保存する方法

#10

投稿記事 by h2so5 » 7年前

UNIX環境でしか動かないようなのであんまり意味ないですが、
以下のようなスクリプトでリアルタイムでコンソールへの表示とファイルへの書き込みができました。

コード:

# tee.rb

require "open3"
STDOUT.sync = true

command = ARGV[0]
logfile = ARGV[1]

File.open(logfile, "w") do |f|
    Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
        Thread.new {
          while out = stdout.gets
            puts out
            f.write out
          end
        }.join
    end
end

コード:

$ ruby tee.rb "ping -c5 h2so5.net" log.txt
PING h2so5.net (219.94.244.34): 56 data bytes
64 bytes from 219.94.244.34: icmp_seq=0 ttl=53 time=70.489 ms
64 bytes from 219.94.244.34: icmp_seq=1 ttl=53 time=72.699 ms
64 bytes from 219.94.244.34: icmp_seq=2 ttl=53 time=69.637 ms
64 bytes from 219.94.244.34: icmp_seq=3 ttl=53 time=72.253 ms
64 bytes from 219.94.244.34: icmp_seq=4 ttl=53 time=72.961 ms

--- h2so5.net ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 69.637/71.608/72.961/1.309 ms

$ cat log.txt
PING h2so5.net (219.94.244.34): 56 data bytes
64 bytes from 219.94.244.34: icmp_seq=0 ttl=53 time=70.489 ms
64 bytes from 219.94.244.34: icmp_seq=1 ttl=53 time=72.699 ms
64 bytes from 219.94.244.34: icmp_seq=2 ttl=53 time=69.637 ms
64 bytes from 219.94.244.34: icmp_seq=3 ttl=53 time=72.253 ms
64 bytes from 219.94.244.34: icmp_seq=4 ttl=53 time=72.961 ms

--- h2so5.net ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 69.637/71.608/72.961/1.309 ms

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: VisualStudioで、実行画面をテキストで保存する方法

#11

投稿記事 by YuO » 7年前

softya(ソフト屋) さんが書きました:
ghffmj さんが書きました:>ありがとうございます。teeコマンドをコマンド引数に指定してみると、確かに両方に表示されましたが、リアルタイムで表示されなく、プログラムの実行が終わってやっと表示してくれるという風になりました。リアルタイムに表示して貰わないと困るのですが、、、何かいい方法がありますでしょうか。
コマンドラインの仕組みなので、それは出来ないです。
cmd.exeはパイプをマルチプロセスで実行するのですが……。

出力部分をofstreamとcoutの両方に出力するようなostream-likeなオブジェクトに置き換えてしまう,というのが,簡単な解法かもしれません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: VisualStudioで、実行画面をテキストで保存する方法

#12

投稿記事 by softya(ソフト屋) » 7年前

>cmd.exeはパイプをマルチプロセスで実行するのですが……。

失礼しました。command.com的な発想が抜け切れていないようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かずま

Re: VisualStudioで、実行画面をテキストで保存する方法

#13

投稿記事 by かずま » 7年前

YuO さんが書きました:出力部分をofstreamとcoutの両方に出力するようなostream-likeなオブジェクトに置き換えてしまう,というのが,簡単な解法かもしれません。
試しに次のようなクラス Tee を作ってみました。

コード:

// --- tee.h ---
#ifndef TEE_H
#define TEE_H

#include <iostream>
#include <fstream>
#include <string>

class Tee {
    std::ofstream ofs;
public:
    Tee();
    Tee& operator<<(const char *);
    Tee& operator<<(char);
    Tee& operator<<(int);
    Tee& operator<<(double);
    Tee& operator<<(std::string&);
    Tee& operator<<(std::ostream& (*)(std::ostream&));
    Tee& operator<<(std::ios_base& (*)(std::ios_base&));
};

namespace std {
    extern Tee tout;
}

#endif // TEE_H

コード:

// --- tee.cpp ---
#include "tee.h"

Tee::Tee() { ofs.open("log.txt"); }
Tee& Tee::operator<<(const char *s)
    { std::cout << s; ofs << s; return *this; }
Tee& Tee::operator<<(char c)
    { std::cout << c; ofs << c; return *this; }
Tee& Tee::operator<<(int i)
    { std::cout << i; ofs << i; return *this; }
Tee& Tee::operator<<(double d)
    { std::cout << d; ofs << d; return *this; }
Tee& Tee::operator<<(std::string& s)
    { std::cout << s; ofs << s; return *this; }
Tee& Tee::operator<<(std::ostream& (*f)(std::ostream&))
    { std::cout << f; ofs << f; return *this; }
Tee& Tee::operator<<(std::ios_base& (*f)(std::ios_base&))
    { std::cout << f; ofs << f; return *this; }

namespace std {
    Tee tout;
}
cout を使うすべてのファイルに
#include "tee.h" と #define cout tout を追加します。

コード:

#include <iostream>

#include "tee.h"
#define cout tout

int main()
{
    std::string hello = "hello";
    std::cout << 3.14 << ' ' << std::hex << 127 << std::endl;
    std::cout << hello << ", world\n";
}
ファイル名が tee.cpp の中に書かれていることと、cout を #define で置換する
ことに改善の余地があるように思います。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: VisualStudioで、実行画面をテキストで保存する方法

#14

投稿記事 by へにっくす » 7年前

softyaさん、このような方法を探していました。ただ、画面上にも表示して、かつtxtにも保存したいのです。
拙作のDOS process LOG writerはいかがでしょう?
以下のページでダウンロードに行ってください。
2005/1/24以降、更新が途絶えていますが、まだ使えます(Win7のDOS窓でも動作確認済み)。
ヘニックスの部屋
ま、tee.vbs作ってる人もいるし
参考にされて見るといいかも。
コマンドプロンプトの出力を、ファイルに保存する - ふにゃるん
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る