none
C++の.exeファイルをタスクスケジューラで実行するとプログラム中のファイルストリーム(ofstream)が実行されない

    質問

  • お世話になります。

    VisualStudio2013上でコーディングしたC++のプログラムを、タスクスケジューラで定期的に実行するシステムを作成しています。

    そのプログラムは、カメラから画像を取得 → ofstreamを用いてcsvファイルを作成 → OpenCVのcv::imwriteで取得した画像を書き出す

    といった構造になっています。.exeファイルから直接実行するか、もしくはF5、Ctrl + F5で実行すると問題なく処理が終わるのですが、.exeファイルをタスクスケジューラで実行すると、画像は書き出されるのですが、ofstreamが実行されず、csvファイルが作成されない事案が発生してしまいました。

    csvファイル以外の作成もofstreamを用いて試してみましたが、一向に改善されませんでした。

    原因がわからず困っています。

    どなたかご教授願います。

    2017年11月23日 13:57

回答

  • ofstream で書き出すときのファイルパスの指定はどのようになっていますでしょうか?相対パスにしている場合は、タスクスケジューラで呼び出された時のカレントディレクトリが、exe を直接実行した場合や Visual Studio から実行した場合と異なることがあります。相対パスになっている場合は、一度絶対パスで指定してみてください。
    • 編集済み kenjinoteMVP 2017年11月23日 16:16
    • 回答としてマーク A.Yu 2017年11月24日 3:38
    2017年11月23日 16:15
  • kenjinoteさんの指摘通り相対パス指定がされておりカレントディレクトリが異なるために、結果的に意図しないディレクトリに出力されているだけと思われます。

    補足ですが、プログラミングでは全般的にエラー処理をすべきですし、仮にタスクスケジューラーから起動したことに起因する問題だったとしてもエラー検出されるはずです。またC++言語には例外機構があるので、仮にofstreamが出力できない状況であれば例外が発生しているはずです。それがないのであれば正常に出力できていることが推測されます。

    非ログオン中などユーザープロファイルが存在しないことに起因する問題も想定されますが、質問文からその辺りの詳しい状況は読み取れませんでした。

    • 回答としてマーク A.Yu 2017年11月24日 3:38
    2017年11月24日 0:52

すべての返信

  • ofstream で書き出すときのファイルパスの指定はどのようになっていますでしょうか?相対パスにしている場合は、タスクスケジューラで呼び出された時のカレントディレクトリが、exe を直接実行した場合や Visual Studio から実行した場合と異なることがあります。相対パスになっている場合は、一度絶対パスで指定してみてください。
    • 編集済み kenjinoteMVP 2017年11月23日 16:16
    • 回答としてマーク A.Yu 2017年11月24日 3:38
    2017年11月23日 16:15
  • kenjinoteさんの指摘通り相対パス指定がされておりカレントディレクトリが異なるために、結果的に意図しないディレクトリに出力されているだけと思われます。

    補足ですが、プログラミングでは全般的にエラー処理をすべきですし、仮にタスクスケジューラーから起動したことに起因する問題だったとしてもエラー検出されるはずです。またC++言語には例外機構があるので、仮にofstreamが出力できない状況であれば例外が発生しているはずです。それがないのであれば正常に出力できていることが推測されます。

    非ログオン中などユーザープロファイルが存在しないことに起因する問題も想定されますが、質問文からその辺りの詳しい状況は読み取れませんでした。

    • 回答としてマーク A.Yu 2017年11月24日 3:38
    2017年11月24日 0:52
  • お早いご回答誠にありがとうございます。

    相対パス指定で行っていたところを絶対パス指定にしたところうまくいきました。

    ありがとうございました。

    2017年11月24日 3:40