1

C++ でファイルを開こうとしています。

私のファイルは /home/me/myproject/mydir/myfile.txt にあります

ファイルが存在し、空でないことをファイル システムで確認しました。

/home/me/myproject/ にいることを getcwd() で確認しました

したがって、私はそれを開こうとしました:

string myfilename;
ifstream myfile;
myfilename = "./mydir∕myfile.txt"; 
myfile.open(myfilename.c_str(), ios::in);
if (myfile.fail()) {
    // I always end up here.
}

myfile.fail() が常に true を返す理由を本当に理解できません。なぜそうなのか、またはなぜそのように振る舞うかを理解するために実行できるデバッグテストはありますか?


みんなのおかげで、何が悪いのかわかりました。「/」(スラッシュ)と「/」(区切り文字)が違うと思われるリモコンソフトを使っています。まだまだ気になる点はあるのですが、別の記事で質問させていただきます。errno と strerror() は、何が問題なのかを理解するのに役立ちました。これらのエラーは見つけるのが難しく、申し訳ありませんが、厳密には C++ コードに関連していませんでした。

(注:どうやら自分の質問に答えることができないので、ここで答えました)。

4

1 に答える 1

0

相対パスを使用してファイルを開くと、実行ディレクトリから計算されます。これは、プログラムの起動方法によって異なります。

プログラムが にあるとし~/path/to/my/programます。起動時の現在のディレクトリが ~ である場合 (つまり、コマンドが./path/to/my/program/my_program)、実行ディレクトリは ~ です。現在のディレクトリが ~/path/to/my である場合 (およびコマンドで起動した場合./program/my_program)、実行ディレクトリは ~/path/to/my です。関数を使用して、現在の作業ディレクトリを特定できますgetcwd()

このような問題を回避するには、アプリケーションで常に絶対パスを使用することをお勧めします。

また、ブロック内で または を使用しerrnoて、エラーに関する詳細情報を取得する必要があります。strerrorif (myfile.fail()) {...}

于 2012-04-23T12:29:37.460 に答える