0

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

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

私のプロジェクトは、#include <string>、<iostream>、<fstream>、および <cassert> を含む静的ライブラリに対してリンクし、静的ライブラリで定義された機能への呼び出しが行われ、std::ifstream::open が呼び出されます。 () (今回は直接)。これに続いて、ストリームは false と評価されます (暗黙の bool 変換演算子と 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;
}

stdout.txt 言います:

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

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

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

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

どこで問題が発生し、それを修正するにはどうすればよいですか?

4

3 に答える 3

2

問題の関数が is_open() かどうかをチェックせずにストリームを close() したという事実の重要性を私は見てきました。

ストリームの fail_bit を設定する (false と評価される) という事実は、私にとってまったく新しいものでした (それが言い訳であるというわけではありません)。

とにかく、C++ リファレンスは非常に明確です。問題は解決しました。

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

    アサート (infile);

于 2009-07-04T09:04:46.333 に答える
0

次のコード:

#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への問題を削除するには:

  • コマンドラインのみを使用してビルドする
  • 静的ライブラリも再構築してください
于 2009-07-04T10:30:31.463 に答える