Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++で現在の作業ディレクトリを取得する方法

この記事では、C言語やC++を使って現在の作業ディレクトリ(カレントワーキングディレクトリ)を取得する方法を解説します。OSごとに用意されている関数が異なるため、プリプロセッサの条件コンパイルを使って、WindowsとUNIX系システムの両方に対応できるコードを紹介します。

実装のポイント

現在の作業ディレクトリを取得するには、以下の関数を使用します。

  • Windows<direct.h>ヘッダーの_getcwd関数
  • UNIX / Linux<unistd.h>ヘッダーのgetcwd関数

これらの違いを吸収するために、マクロ定義を使って環境に応じた関数を自動的に選択するのが一般的な手法です。

サンプルコード

#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

#include<iostream>
using namespace std;

std::string get_current_dir() {
    char buff[FILENAME_MAX]; // パスを格納するための文字列バッファを作成
    GetCurrentDir( buff, FILENAME_MAX );
    string current_working_dir(buff);
    return current_working_dir;
}

main() {
    cout << get_current_dir() << endl;
}

コードの解説

  • #ifdef WINDOWS:Windowsとしてコンパイルされる場合は_getcwdを、それ以外の場合はgetcwdGetCurrentDirという共通の名前で定義します。
  • char buff[FILENAME_MAX]FILENAME_MAXは、ファイルパスの最大長を表す定数で、パス全体を格納できる十分なサイズのバッファを確保します。
  • GetCurrentDir(buff, FILENAME_MAX):バッファに現在の作業ディレクトリの絶対パスを書き込みます。
  • 取得したパスはstd::stringに変換して返すことで、扱いやすくしています。

実行結果

D:\C++ Programs\section 53

このように、プログラムを実行した時点での作業ディレクトリの絶対パスが出力されます。実行環境やプログラムを起動した場所によって、表示されるパスは異なります。

注意点

  • C++ではmain関数は必ず戻り値型intを明示することが推奨されています(int main())。
  • より現代的なC++17以降の環境では、<filesystem>ヘッダーのstd::filesystem::current_path()を使う方法もあり、クロスプラットフォームで簡潔に記述できます。
  1. グラフ内のスーパー頂点を見つけるC++プログラムの解説

    問題の概要n個の頂点を持つグラフが与えられていると仮定しましょう。頂点には1からnまでの番号が付けられており、配列「edges」に含まれる辺によって互いに接続されています。さらに、各頂点は1からnの範囲の数値である「x」という値を持ち、その値は配列「values」で与えられます。このとき、グラフの中から「スーパー頂点(super vertex)」と呼ばれる特別な頂点を見つけ出す必要があります。頂点iがスーパー頂点であるとは、頂点1から頂点iへの最短経路上に、i番目の頂点と同じ「x」の値を持つ頂点が存在しないことを意味します。この条件を満たすすべての頂点を出力してください。たとえば、入力が n

  2. グリッド内で照らされているセルの数を求めるC++プログラム

    問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb