2016-10-22 53 views
-1

私はこれを解決できないのは恥ずかしいですが、私はこの仕事をすることはできません。私はこの簡単なテストを持っています:ifstreamがファイルを見つけることができません

std::string archnom = "../data/uniform.txt"; 
ifstream archin(archnom.c_str()); 
ASSERT(archin.good()); 

アサートは投げている間違いです。何らかの理由でuniform.txtファイルが見つかりません。プロジェクト構造は次のとおりです。

​​

私はすでに次のように成功せずarchnom変更しようとしました:

std::string archnom = "/data/uniform.txt"; 
std::string archnom = "./data/uniform.txt"; 
std::string archnom = "../data/uniform.txt"; 
std::string archnom = "data/uniform.txt"; 

は、ここでの問題は何ですか?

+0

あなたのプログラムファイルがどこにあるかそれが問題ではありません。実行時の現在の作業ディレクトリは何ですか? – melpomene

+0

問題は、プロセスの現在のディレクトリを把握する必要があることです。これはcc/gccを使ったシェルプロンプトからC++をハックすることを学ぶ "古い学校"の利点の1つです。現代的なポイントアンドドロップGUIのIDEと比べると、疑いの余地はありません。現在のディレクトリが何であるか、そしてすべてのファイルがどこにあるのかについて決して混乱しません。 –

+0

@melpomeneプロジェクトのルートにあります。私はちょうど投稿を編集しました –

答えて

2

端末では、と入力するとa.outプログラムを起動し、./を現在の作業ディレクトリとして使用できます。

これを行うと、プログラムで使用される相対ファイルパスは、./ dir-ではなく、プログラムを含む相対パスとなります。 ない - 私は(とex.txtビルドと同じディレクトリにある)./build/a.outを実行しているときにex.txtを開きたい場合は

例えば、私のプログラムは./ex.txt相対パスを持っている必要があります../ex.txt

+0

私はあなたが言うことを完全に理解しているとは思わない...もう少し詳しく説明できますか? –

1
std::string archnom = "../data/uniform.txt"; 

uniform.txtがアップデータに戻っ1つのディレクトリを行くとにより求めることができるプログラムを指示します。

しかし、どのディレクトリでプログラムが探し始めますか?良い質問。その場所は作業ディレクトリと呼ばれ、残念ながらそれは動く。通常、作業ディレクトリは、プログラムの実行元ディレクトリではなく、プログラムが実行されるディレクトリとして開始されます。興奮を高めるために、プログラムは実行中に作業ディレクトリを変更することができます。

だからあなたのプログラムが/ホーム/ボブ/コードであるとuniform.txtファイルが/ホーム/ボブ/データであり、あなたが/ホーム/ボブ/コードからプログラムを実行する場合./programすべてが良いです。作業ディレクトリは/home/bob/codeで、プログラムは1つのフォルダに戻り、次にデータになります。

何が/ホーム/ボブ/ワークスペースにあった、あなたが../code/programを実行した場合。作業ディレクトリは/home/bob/workspaceであり、プログラムは1つのフォルダに戻り、データに戻ります。

/から/home/bob/code/programにプログラムを実行するとどうなりますか?作業ディレクトリは/です。あなたは本当にどこに戻ってもらえませんか?

少し極端な例を試してみましょう:/etcプログラムは/に戻り、ラットに転送されます。いいえデータディレクトリ。

uniform.txtファイルが常に同じ場所にあり、この場所が保証されている場合は、固定パスを使用します。 uniform.txtがプログラムのインストールディレクトリの近くにある場合、プログラムはどこにあるかを知る必要があり、that takes OS specific codeです。

1

現在の作業ディレクトリが期待どおりになっていることを確認する必要があります。 _chdir(win32)またはchdir(gcc)を使用し、argv [0](現在実行中の実行可能ファイルへのパスを含む)を使用して、これを行うことができます。

私はここで別の質問に対する私の答えでこれを行う方法を示した:

Change the current working directory in C++

関連する問題