VC++ の勉強を始めたばかりでよくわからないので、教えて下さい。

以下を教えて下さい。

1.タイムスタンプ(HH:MM:SS)を表示させる方法
2. ライン数がを表示させる方法

VC++初心者向けの本に上記のようなものがありましたが、
System::Diagnostics::Debug::WriteLine("hogehoge");
引数がふたつしか取れません。(同時に表示できる変数は2つまで?)
もっとよいものがあれば教えて下さい。

ラインに限っていえば、こんなイメージ。
printf("filename = %s , line = %d\n",__FILE__,__LINE__ );
これに相当するものを知りたいです。


あと、トレースした部分をログファイルに書き出してくれる機能とか
あるのでしょうか?あれば教えてください。
(とりあえず、聞いてみてるだけです。)

VC++は、2008ExpressEditionと.NET 2003を使っています。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/12/25 22:43:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント80pt

VC++は、2008ExpressEditionと.NET 2003を使っています。

まず、最初に確認ですが、作成されたいアプリケーションのタイプは、

  • Windows ネイティブアプリケーション
  • .NET アプリケーション

のどちらでしょうか?


「Visual C++ .NET 2003」「Visual C++ 2008 Express Edition」のどちらでも

「Windows ネイティブアプリケーション」「.NET アプリケーション」を作成可能ですが、

それぞれの開発環境により、利用可能なライブラリや構文が異なるので注意が必要です。


主なライブラリの使用用途としては、

  • Visual C++ .NET 2003
    • Win32 … C/C++ と Win32 API によるネイティブアプリケーション作成用
    • MFC … GUI アプリケーション(ネイティブアプリケーション)作成用
    • ATL … コンポーネント作成用
    • .NET(Managed C++)… .NET アプリケーション作成用(古い構文を使用)
  • Visual C++ 2008 Express Edition
    • Win32 … C/C++ と Win32 API によるネイティブアプリケーション作成用
    • CLR(VC++/CLI)… .NET アプリケーション作成用(新しい構文を使用)

という感じでしょうか。


「Visual C++ 2008 Express Edition」を使用されているということですので、

「CLR(VC++/CLI)」を使用して「.NET アプリケーション」を作成した場合について説明致します。

1.タイムスタンプ(HH:MM:SS)を表示させる方法

.NET のライブラリでは日付型を「HH:mm:ss」で書式化することで

「HH:MM:SS」の形式で表示されます。

■ @IT:.NET TIPS 日付や時刻を文字列に変換するには? - C# VB.NET
http://www.atmarkit.co.jp/fdotnet/dotnettips/200customdate/

2. ライン数を表示させる方法

StackTrace を用いることでファイル名、行番号が取得可能です。

ただし、最適化の関係で、デバッグ版でしか正しい行番号が取得できないようです。

■ StackTrace クラス (System.Diagnostics)
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stack...

トレースした部分をログファイルに書き出してくれる機能

DefaultTraceListener にて出力先のファイル名を指定することで、

トレースした内容をログファイルに出力することが可能です。

■ @IT:.NET TIPS デバッグ・メッセージをファイルに出力するには? - C# VB.NET VS.NET
http://www.atmarkit.co.jp/fdotnet/dotnettips/146debugonfile/debu...

以下は、サンプルになります。

Release ビルドでも Debugt::WriteLine() でファイル出力してしまうようですので、#if defined(_DEBUG) を用いて Debug ビルド時のみ出力するようにしています。

// File : DebugWriteLineTest.cpp
// Compile : cl DebugWriteLineTest.cpp /clr /D "_DEBUG" /FU "c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll" [Enter]
// Usage : DebugWriteLineTest.exe [Enter]
using namespace System;
using namespace System::Diagnostics;

int main(array<System::String ^> ^args)
{
#if defined(_DEBUG)
    // ■ @IT:.NET TIPS デバッグ・メッセージをファイルに出力するには? - C# VB.NET VS.NET
    // http://www.atmarkit.co.jp/fdotnet/dotnettips/146debugonfile/debugonfile.html
    DefaultTraceListener^ dtl = (DefaultTraceListener^)Debug::Listeners["Default"];
    dtl->LogFileName = "C:\\TEMP\\debug.txt";
#endif

    // ■ @IT:.NET TIPS 日付や時刻を文字列に変換するには? - C# VB.NET
    // http://www.atmarkit.co.jp/fdotnet/dotnettips/200customdate/customdate.html
    DateTime^ dt = DateTime::Now;
    Debug::WriteLine( "DateTime: " + dt->ToString("HH:mm:ss") );

    // ■ StackTrace クラス (System.Diagnostics)
    // http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stacktrace.aspx
    StackTrace^ st = gcnew StackTrace(true);
    StackFrame^ sf = st->GetFrame(0);
    Debug::WriteLine( "File: " + sf->GetFileName() );
    Debug::WriteLine( "Line Number: " + sf->GetFileLineNumber().ToString() );

    Debug::WriteLine( "Hello World" );
    return 0;
}

<実行結果(C:\TEMP\debug.txt の内容)>

DateTime: 19:19:36
File: c:\home\edu\vs2008\vc9\clr\debugwritelinetest\debugwritelinetest\debugwritelinetest.cpp
Line Number: 19
Hello World
id:futurista

丁寧なご回答有難うございます。

幾つかリンク切れがあり、参照できないページがありましたが、

サンプルコードを組み込み、動作させたところ、概ね出来ました。

但し、行数表示に関しては、

Debug::WriteLine( "Line Number: " + sf->GetFileLineNumber().ToString() );

の行番号ではなく、

StackTrace^ st = gcnew StackTrace(true);

の行番号が表示されました。

ご指摘の通り、最適化の関係で、デバッグ版でしか正しい行番号が取得できない

ということでしょうか?

2009/12/20 22:31:20
  • id:cx20
    > 幾つかリンク切れがあり、参照できないページがありましたが、

    失礼しました。
    以下のリンク切れを確認しましたが、ほかにもありますでしょうか?

    ■ @IT:.NET TIPS 日付や時刻を文字列に変換するには? - C# VB.NET
    http://www.atmarkit.co.jp/fdotnet/dotnettips/200customdate/

    http://www.atmarkit.co.jp/fdotnet/dotnettips/200customdate/customdate.html

    > StackTrace^ st = gcnew StackTrace(true);
    > の行番号が表示されました。

    以下のコードを試してみてください。

    int GetFileLineNumber()
    {
    StackTrace^ st = gcnew StackTrace(1, true); // コンストラクタの1はひとつ前のスタックの意味
    StackFrame^ sf = st->GetFrame(0);
    return sf->GetFileLineNumber();
    }

    int main(array<System::String ^> ^args)
    {
    Debug::WriteLine( "Line Number: " + GetFileLineNumber().ToString() );
    return 0;
    }

    <参考情報>
    ■ C#で__LINE__や__FILE__プリプロセッサマクロを使いたい 屋根裏部屋別館blog/ウェブリブログ
    http://messiah-annex.at.webry.info/200502/article_7.html
  • id:cx20
    補足です。

    > ご指摘の通り、最適化の関係で、デバッグ版でしか正しい行番号が取得できない
    > ということでしょうか?

    Release ビルドでも Debug 版と同様の設定にすることで、情報が取得できそうです。
    ・デバッグ情報の生成:[はい(/DEBUG)
    ・デバッグできるアセンブリ:[ランタイム トラッキングおよび最適化の無効 (/ASSEMBLYDEBUG)]

    あと、そもそも的な話ですが、C++/CLI であれば、
    C のランタイムならびにマクロも利用可能な為、
    printf("filename = %s , line = %d\n",__FILE__,__LINE__ );
    でも出力可能なようです(ほとんど、C++/CLI は使ったことが無いので、ちゃんと検証していないのですが・・・)
  • id:mystashes
    既にcx20さんが素晴らしい回答が付いておりますので、追加情報のみコメントにて失礼致します。
    > printf("filename = %s , line = %d\n",__FILE__,__LINE__ );
    > これに相当するものを知りたいです。
    もし、.NET,C#でC言語のフォーマット指定子にあたるものが必要とお考えであれば、それは不要です。
    String型は + 演算子で異なる型を文字列として結合できます。(str + int + str 等)

    今回の例ですと、下記のようにすれば良いです。
    Debug::WriteLine( dt->ToString("HH:mm:ss") + " - Function Name: Filename=" + sf->GetFileName() + ",LineCount=" + sf->GetFileLineNumber() );
    ※sf->GetFileLineNumber()はInt32ですが、Stringと+演算子で結合しても問題ありません。(私は文字列のポインタにintの数値を加算するという感覚がどうしても抜けませんでした)
    多少Cのフォーマット指定子っぽく書くなら下記の通りです。
    Debug::WriteLine( String::Format( "{0} - Function Name: Filename={1},LineCount={2:d}", dt->ToString("T"), sf->GetFileName(), sf->GetFileLineNumber() ) );

    C言語から.NET,C#に意向されるのであれば下記サイトがご参考になるかもしれません。(C言語との違いが判りやすいです)
    http://homepage2.nifty.com/c_lang/
    のC#編
    上記のフォーマット指定子に関しては
    http://homepage2.nifty.com/c_lang/cs/cs_07.htm
    String型の説明は
    http://homepage2.nifty.com/c_lang/cs/cs_08.htm
    日付の書式は
    http://homepage2.nifty.com/c_lang/cs/cs_52.htm
    に記載があります。
  • id:futurista
    >> cx20さん

    補足情報で、ライン数が正しく表示することができました。有難うございました。


    >> mystashesさん

    度々、有難うございます。参考になりました。
    今後ともよろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません