3

現在のオペレーティングシステムのファイル区切り記号を取得する方法を教えてください。たとえば、Windowsでは\、Unixでは/、実行時にはFortranです。Fortranでファイル区切りを取得する

+0

「現在のOSのパス区切り文字」?それは何ですか? – Rook

+0

現在のOSを編集しました - 魔女のオペレーティングシステムが実行されます –

+0

ああ、もちろん..... – Rook

答えて

4

Fortran 2003標準組み込みプロシージャーGET_ENVIRONMENT_VARIABLEを使用して、このようなことを行うことができます。例:

CHARACTER(LEN=99999) :: path 
CHARACTER(LEN=1)  :: path_separator 
CALL GET_ENVIRONMENT_VARIABLE('PATH',path) 
path_separator=path(1:1) 
WRITE(*,*)'Path separator is ',path_separator 
END 

このプログラムは、UNIXまたはLinuxのパス区切り文字として "/"を出力します。あなたは他の環境変数からもこれを得ることができます。この例は、UNIX/Linuxの場合に固定されています。たとえば、抽出するために少し異なるロジックが必要になります。 "\"はWindows用ですが、私はこのシステムに精通していません。 Win95から "c:\ ....."のようなものを覚えていますので、Windowsの場合はpath(3:3)で "\"を探します。

これが役に立ちます。

+1

最初の文字を抽出するには、PATH環境変数から99999文字を読み込む必要がありますか? – Chris

+0

@Chris +1いいえ。長さを取らなければならないとき(たとえば、Windowsでどのように見えるかわからないなど)、私は任意に長く行きます。私は99の長さはちょうどいいと思う。 – milancurcic

+0

@Chris 99999文字は実際には読み込まれないことに注意してください。プログラムは、パスの長さが何であっても読み込みます。残りの部分は空白になるだけです。 – milancurcic

3

私が知る限り、Fortran標準は、ファイルシステムのパス区切りについて何も言わない。私が提案できる最適なのは、適切なセパレータを定義するマクロを定義することです。たとえば

について
#if __unix__ 
character(len=1), parameter :: path_sep='/' 
#elif _WIN32 
character(len=1), parameter :: path_sep='\' 
#else 
#error "path_sep not defined. Set this constant for your system." 
#endif 

はしかし、Windows上は、あなたのパス区切り(それを試してみてください!)ので、ほとんどのシステムでは、パスの区切りと特別な何かをする必要がないよう/または\のいずれかを使用することができます。

実行時にパス区切りを指定する必要はありません。。新しいシステムごとにFortranソースを再コンパイルする必要があるので、新しいシステムごとにコンパイル時に正しいパス区切りを指定する必要があります(パスの区切り文字は、同じシステム上のプログラム)。

上記のようなプリプロセッサマクロを使用することは明らかです。コードを移植する新しいシステムごとに新しい#elif句を追加するだけです。これは、他の答えが示唆するような特定の環境変数をチェックするピクシール解を導入するよりも簡単です。

さらに、パス区切り文字を指定する場合は、オペレーティングシステム環境の他の側面についてもパラメータを設定する必要があります。たとえば、現在のディレクトリ文字と親ディレクトリの文字(それぞれWindowsとPOSIXシステムの場合は...)です。

最後に、プリプロセッサーが__unix___WIN32と定義しているのは、どのシステムを使用しているかを示す広く使用されているシステムで、どのシステムに依存しているかはほとんどのコンパイラーで設定する必要があります。これらのマクロの1つを設定するためにソースをコンパイルするときは、通常、フラグ-D__unix__=1または-D_WIN32=1を使用することができます。 -cpp(gfortran)または-fpp(ifort)コマンドラインオプションを使用してコードを前処理するか、ソースファイルの拡張子を.fから.Fまたは.f90から.F90に変更します。

+0

私は成功しませんでした。私はこれが不正なプリプロセッサ命令であるというエラーがありました。私はgfortranコンパイラを使用しています –

+0

あなたはファイルを前売りしなければなりません。ファイル拡張子を.fから.Fに変更するか、.f90から.F90に変更してください。あるいは、intelコンパイラを使用している場合は、これらのプリプロセッサでファイルをコンパイルするときに-fppフラグを使用できます。 – Chris

+0

@Sergey申し訳ありませんが、gfortranを使用していると言われました。プリプロセッサを起動するには、-cppフラグを使用します。 – Chris

1

IRO-ボットの提案に続いて、新しい環境変数を作ることができ、UNIX

で例えば

export DELIMITER='/' 

今だけ「\」で、ウィンドウ内の対応する変数を作成し、あなたが優れています行く。

は、Windowsでグローバル変数を設定するために、あるいはそうする権利を持っていない、.BATファイルでセットの詳細について

set DELIMITER=\ 

を以下に置き、見たくない場合http://www.ss64.com/nt/set.html setを使用する場合は、CMDからfortranプログラムを実行する必要があります。

Finalyはなく、1つの修正と、私はむしろ、上記4のソリューションを好むあなたのFORTRANファイルに

CHARACTER :: delimiter 
CALL get_environment_variable('DELIMITER',delimiter) 
0

を次のように置く:

function delimiter_detect() result(delim) 
    character(LEN=1) :: delim 
    character(LEN=258) :: path 
    integer :: ii, stat_out 
    call GET_ENVIRONMENT_VARIABLE('HOME',path,status=stat_out) 
    if (stat_out/=0) go to 999 
    ! xxx path='xx\' ! alternate test 
    do ii=1, 258 
    delim=path(ii:ii) 
    if (delim=='/'.or.delim=='\') return 
    ! ... Note: emacs does not recognize the second delimiter test 
    enddo 
999 continue 
write(*,'(1x,a/1x,a/1x,a)') 'Could not obtain home directory path.', & 
    'Restart program and manually insert path', & 
    'to folder/directory containing input files.' 
stop 
end function delimiter_detect 

私はコンセプトをテストしていません、と述べましたWindows OS上で。

+1

この変更内容を教えてください。あなたがどの答えを参照するのかは明らかではありません。 – francescalus

関連する問題