2016-10-01 10 views
-1

ファイルから読み込もうとしています。そして、それは(少なくとも)相対的な道を望んでいるようです。私が見るチュートリアルのほとんどはファイル名を使用しています。ファイルから読み込むとき、パラメータは完全なパスでなければなりませんか?

私はsrcディレクトリとbuildディレクトリを1つのディレクトリに持っています。私が相対パスを渡すと、それは動作します。しかし、Dockerコンテナ内でこのコードを実行しようとすると、絶対パスを渡さないとコードが機能しなくなります。

何か間違っていますか?ファイルを読むのは難しいことではありません。

"ファイル名" は
std::string line; 
    std::vector<std::string> thingsToDo; 
    std::ifstream myfile(filename); 
    if (myfile.is_open()) { 
     while (getline(myfile, line)) { 
      thingsToDo.push_back(line); 
     } 
     myfile.close(); 
    } 
    else { 
     std::cout << "Unable to open file" << std::endl; 
    } 

...

std::string filename = "things.txt" << works in tutorials, but not in real life :\ 
std::string filename = "../src/things.txt" << works on my machine :) (because remember, we are running the code from 'build' dir) 
std::string filename = "/tmp/abolute/path/things.txt" << works in Docker :\ 

ヘルプ...

+4

相対パスが異なる環境で動作しない場合は、出発点が変更されました。現在の作業ディレクトリを確認してください。 –

+2

IDEからプログラムを実行すると、作業ディレクトリが期待どおりに動作しない可能性があります。コマンドラインから実行する場合、作業ディレクトリはあなたが現在使っているディレクトリです。ほとんどのIDEにはプロジェクトの固定作業ディレクトリを設定するオプションがあり、コマンドラインからは正しいディレクトリにcdすることができます。しかし、ポイントは、プログラムの現在の作業ディレクトリが予期せぬものになる可能性があり、相対パス( '../'パスなど)が予告なく失敗する可能性があることです。絶対パスは決して失敗しません(パスが当然存在しない限り)。 –

+0

あなたはどうやってそれをやりますか?同様に、私はコマンドラインからこのプログラムを実行しています。だから、私が「ビルド」しているとしよう。そして、私は./myプログラムに行きます。今私はドッカーを介して実行されます。そして今私は/ tmp/abolute/path/src/myProgramのような私のプログラムを呼び出す。プログラムは今どこにあると思いますか?ええと? – Bear

答えて

0

を解決しよう:

は、ここに私のコードです。最も簡単なこと:ファイルをビルドにコピーします。それから、ファイル名を渡すだけです。

方法:

CMakeLists:

configure_file (
    "${PROJECT_SOURCE_DIR}/things.txt" 
    "${PROJECT_BINARY_DIR}/things.txt" 
) 
関連する問題