4

重複の可能性:
C または C++ でのディレクトリの作成

「BobtheBuilder」というタイトルのフォルダを作りたいです。そして、その中にテキストファイルを作成したいと思います。私は自分の道を意識せずにこれをやりたいです。次のように入力する必要はありません。

ofstream out("C:/MyComputer/User/Jeff/etc/BobtheBuilder/NewFile.txt");

実行可能ファイルが次のように含まれているこの領域に対してローカルにするだけです。

ofstream out("/BobtheBuilder/NewFile.txt");

これは可能ですか?ファイル管理を行うには、パス名全体を知っている必要がありますか? 次のように、プログラムと同じディレクトリにあるファイルを作成または開くことができるため、これが可能だと思います。

ifstream inf("NewFile.txt");

または、次のように前のパスを埋める特別なキーワードがあります:

ifstream inf("FILLIN/BobtheBuilder/NewFile.txt");

ありがとう

4

2 に答える 2

3

パス全体を指定しなくても、 「BobtheBuilder/NewFile.txt」のような相対パスを絶対に指定できます。ただし、ファイルの前にまずフォルダーを作成する必要があります。フォルダーの作成はプラットフォーム固有であり、Windows を使用しているため、 「BobtheBuilder」をパラメーターとしてCreateDirectory関数を呼び出す必要があります。フォルダは、実行可能ファイルが存在するのと同じフォルダであるプログラムのデフォルトの作業ディレクトリに作成されます。フォルダとファイルを作成する前に、 SetCurrentDirectory関数を使用してこの作業ディレクトリを変更できます。

于 2012-05-27T07:30:05.500 に答える
0

ディレクトリを作成するには、C 関数を使用できます。

int mkdir(const char *pathname, mode_t mode);

Boostを使用できる場合は、本当に簡単になり、C++ との親和性が高くなります。

bool create_directories(const path& p);

// usage example
boost::filesystem::create_directories("./BobtheBuilder");

質問で述べたように、絶対パスと相対パスの両方を使用できます。それはあなたの意図に依存します。あなたの場合、次のことができます:

boost::filesystem::create_directories("./BobtheBuilder");
ofstream out("./BobtheBuilder/NewFile.txt");

絶対パスを指定する必要はまったくありません。

パスを頻繁に管理する必要がある場合、Boost はパス管理に役立つ多くのツールを提供します。例として、質問で言及した問題を考えてみましょう。現在のディレクトリへのフルパスを取得してから、相対パスを追加したいとします。これは非常に簡単に実行できます。

 #include <boost/filesystem.hpp>
 namespace fs = boost::filesystem;
 ...
 fs::path curr_abs_path = fs::current_path();
 fs::path rel_path = "foo/bar";
 fs::path combined = (curr_abs_path /= rel_path);
 cout << combined << endl;

現在のディレクトリが /tmp/ であると仮定すると、前のコード スニペットは次のように出力されます。

/tmp/foo/バー

operator/=2 つのパスを追加し、結合された結果を返す役割を果たします。

于 2012-05-27T09:40:29.000 に答える