ページ 11

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

Posted: 2012年12月19日(水) 18:16
by ghffmj
Visual Studio2010を使って、C++のプログラムを作成しています。

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

よろしくお願いします。

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

Posted: 2012年12月19日(水) 18:20
by h2so5
printfやscanf、std::coutなどの入出力先をファイルに変更する
http://www.programming-magic.com/20100916205128/

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

Posted: 2012年12月19日(水) 18:24
by softya(ソフト屋)
リダイレクトすれば保存できます。
hozon.txtに保存するとして

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

Visual Studio上からなら、
プロジェクトのプロパティ → デバッグ → コマンド引数に > hozon.txt と入力。

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

Posted: 2012年12月19日(水) 18:39
by ghffmj
h2so5 さん、ありがとうございます。このような方法もあるのですね。
softyaさん、このような方法を探していました。ただ、画面上にも表示して、かつtxtにも保存したいのです。
これだと、画面上には何も表示されませんでした。

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

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

Posted: 2012年12月19日(水) 18:52
by softya(ソフト屋)
Linuxならteeコマンドをパイプすれば出来ますがWindowsは標準ではないようです。

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

system32にコピーするのはオススメしません。何処かにフォルダを作って環境パスを通してください。

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

Posted: 2012年12月19日(水) 18:55
by nil
参考:猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/cpp/cpp_01.htm

コード:

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

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

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

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

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

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

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

Posted: 2012年12月20日(木) 21:09
by softya(ソフト屋)
ghffmj さんが書きました:>softyaさん
ありがとうございます。teeコマンドをコマンド引数に指定してみると、確かに両方に表示されましたが、リアルタイムで表示されなく、プログラムの実行が終わってやっと表示してくれるという風になりました。リアルタイムに表示して貰わないと困るのですが、、、何かいい方法がありますでしょうか。
コマンドラインの仕組みなので、それは出来ないです。
やはり、プログラムから同時にファイル出力をするしか無いと思います。

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

Posted: 2012年12月20日(木) 22:26
by h2so5
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

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

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

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

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

Posted: 2012年12月21日(金) 01:52
by softya(ソフト屋)
>cmd.exeはパイプをマルチプロセスで実行するのですが……。

失礼しました。command.com的な発想が抜け切れていないようです。

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

Posted: 2012年12月22日(土) 17:19
by かずま
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 で置換する
ことに改善の余地があるように思います。

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

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