2017-07-21 6 views
0

は、私はこの短いプログラムを持っている:私は引数を供給しない場合これはなぜプログラムのディレクトリ内のファイルを開きませんか?

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <string> 

int main (int argc, char * argv[]) { 
    std::string homedir = std::getenv("HOME"); 
    std::string filename = argc > 1 ? argv[1] : (homedir + "/" + "file"); 
    std::cout << homedir << std::endl; 
    std::cout << filename << std::endl; 
    std::fstream file; 
    file.open(filename, std::ios::out); 
    file << "Yo yo waddup" << std::endl; 
    file.close(); 
    return 0; 
} 

、それはユーザーのホームディレクトリにファイルを開きます。それは当然のことです。私はこのような別のディレクトリから実行するときしかし:

$ ./folder/hometest examplefile 

プログラムは、私の現在のディレクトリの代わりに、プログラムがあるディレクトリに「examplefile」を作成します。

なぜこれが起こっているのですか?

+1

これは特にC++に関する質問ではないようです。他のすべてのシェルコマンドについても同じ動作が得られます。 – Rakete1111

+1

あなたのプログラムを通過する必要があります。プログラムは大丈夫です。期待どおりに働く。 – Omkar

+0

質問を見ると、現在の作業ディレクトリのパスを取得し、o/pファイルのパスに追加することをお勧めします。 – Omkar

答えて

2

なぜこれが起こっているのですか?

プログラムは期待どおりの動作をしています。

ファイルは、実行可能ファイルが存在しない現在の作業ディレクトリを基準にして開きます。

それがそのように動作しなかった場合は、

  1. あなたのすべてのプログラムは、プログラムの場所は、ファイルが殺到するだろう、絶対パスと仕事をしなければならない、または
  2. ます。まず、アクセス許可の問題のためにこれが可能でない可能性があります。第二に、マルチユーザーシステムでは、ユーザーは同じファイル名/ディレクトリを作成しようとします。

上記のいずれも望ましいものではない。

関連する問題