質問

std::ifstream::open() に関していくつかの質問があることは承知していますが、その回答では私の問題は解決されませんでした。それらのほとんどは Win32 に固有のもので、私は SDL を使用しており、OS 固有の機能には触れていません (... それは SDL にまとめられていません)。

問題は:Dev-C++ から Code::Blocks に切り替えてから (両方で同じ MinGW-GCC バックエンドを使用しています)、std::ifstream::open() が機能しなくなったようです。 Windows XPからVistaまで。(OS X / xcode (GCC バックエンド) でも完全に動作します。)

私のプロジェクトは、<string>、<iostream>、<fstream>、および <cassert> を #include する静的ライブラリにリンクし、静的ライブラリで定義された機能への呼び出しが行われ、次に std::ifstream::open が呼び出されます。 () (今回は直接)。これに続いて、ストリームは false と評価されます (暗黙的なブール変換演算子と Good() メソッドの両方を使用)。

コード:

#include "myStaticLibrary.hpp"

int main(int argc, char **argv)
{
  std::string filename("D:/My projects/Test/test.cfg");

  std::cout << "opening '" << filename << "'..." << std::endl;
  bool success(false);

  // call to functionality in the static library
  {
    std::ifstream infile(filename.c_str());
    success = infile.good();
    // ...
  }
  // success == false;

  // ...
  return 0;
}

stdcout.txt には次のように書かれています。

「D:/マイプロジェクト/Test/test.cfg」を開いています...

stdcout.txt を開いて、ファイル名を含むパスを [スタート] メニューの [ファイル名を指定して実行] にコピーして貼り付けると、ファイルは正常に開きます (ただし、これがどの程度の診断値であるかは完全にはわかりません。また、アドレスは次の形式に変換されます。ファイル:///D:/My%20projects/test/test.cfg)。

また、「/」を二重のバックスラッシュのエスケープシーケンスに置き換えてみました(繰り返しますが、以前はスラッシュが正常に機能していました)が、結果は同じでした。

それ デバッグ バージョンですが、main() の argv[0] から取得した絶対パス全体を使用しています。

どこが間違っているのでしょうか?それを修正するには何をする必要がありますか?

役に立ちましたか?

解決

私は)問題の関数があれば(IS_OPEN確認せずにDストリーム)(クローズを持っているという事実の重要性を監督しています。

それは(それが偽に評価させる)、ストリームのfail_bitを設定するという事実は、(それはそれは言い訳だということではありません)私には全く新しいだった、とこのコードの動作を前にした理由を私はまだ理解していません。

とにかく、C ++の参照は、その上に非常に明確です。問題が解決されました。

他のヒント

  1. 問題を再現する最小限のセットを作成してください。たとえば、上記のコードには argv の解析と文字列の連結がありますが、これは質問の必要な部分とは思えません。最小限のセットは、あなた (そして私たち) が何が問題なのかを正確に把握するのに役立ち、「GetPath() とは何ですか?」などの質問に気を取られないようにすることができます。
  2. 代わりにこれを実行してみてください assert(infile.good()):

    アサート(infile);

次のコード:

#include <string>
#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;;

int main(int argc, char **argv)
{
  std::string filename("D:/My projects/Test/test.cfg");
  std::cout << "opening '" << filename << "'..." << std::endl;
  std::ifstream infile(filename.c_str());
  assert(infile.good()); // fails

  return 0;
}

必要なディレクトリ構造を作成すれば、MinGW g++ 4.4.0 を使用する Windows システムで正常に動作します。test.cfg ファイルは実際に存在しますか?入力用にストリームを開いている場合、ファイルが存在しないと失敗します。

編集: DevC++ から CB への問題を解決するには:

  • コマンドラインのみを使用してビルドする
  • 静的ライブラリも必ずリビルドしてください
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top