Windows std::ifstream::open() の問題
質問
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 ++の参照は、その上に非常に明確です。問題が解決されました。
他のヒント
- 問題を再現する最小限のセットを作成してください。たとえば、上記のコードには argv の解析と文字列の連結がありますが、これは質問の必要な部分とは思えません。最小限のセットは、あなた (そして私たち) が何が問題なのかを正確に把握するのに役立ち、「GetPath() とは何ですか?」などの質問に気を取られないようにすることができます。
代わりにこれを実行してみてください
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 への問題を解決するには:
- コマンドラインのみを使用してビルドする
- 静的ライブラリも必ずリビルドしてください