web-dev-qa-db-ja.com

ifstream:指定されたファイルが存在しないかどうかを確認する方法

読み取り用にファイルを開きたい。ただし、このプログラムのコンテキストでは、ファイルが存在しなくても構いません。先に進みます。エラーが「ファイルが見つかりません」の場合と、エラーがそうでない場合を特定できるようにしたいと思います。それ以外の場合は、終了してエラーにする必要があります。

fstreamでこれを行う明白な方法は見当たりません。


これは、Cのopen()およびperror()を使用して実行できます。これを行うにはfstream方法もあると思いました。

39
Paul Nathan

ファイルを開いた結果はOS固有であるため、標準C++にはさまざまなタイプのエラーを区別する方法はないと思います。ファイルが開くか、開かないかのいずれかです。

読み取り用にファイルを開いてみてください。開かない場合は、ファイルが存在しないか、他のエラーが発生したことがわかります。その後、再度書き込みのためにそれを開こうとして失敗すると、それは「他の何か」カテゴリに分類される可能性があります。

9
Cogwheel

編集:これは、ファイルが存在しないことを必ずしも示すものではないことを通知されました。アクセス許可やその他の問題が原因でフラグが立てられる場合があります。

私はこれに答えるのが非常に遅いことを知っていますが、ブラウジングしている人のためにコメントを残すと思いました。 ifstreamの失敗インジケータを使用して、ファイルが存在するかどうかを確認できます。

ifstream myFile("filename.txt");
    if(myFile.fail()){
        //File does not exist code here
    }
//otherwise, file exists
57
SwarthyMantooth

「ファイルが存在しない」かどうかはわからないと思います。汎用チェックにはis_open()を使用できます。

ofstream file(....);
if(!file.is_open())
{
  // error! maybe the file doesn't exist.
}

boostを使用している場合は、boost::filesystem

#include <boost/filesystem.hpp>
int main()
{
    boost::filesystem::path myfile("test.dat");

    if( !boost::filesystem::exists(myfile) )
    {
        // what do you want to do if the file doesn't exist 
    }
}
38
AraK

http://www.cplusplus.com/forum/general/1796/ からの簡単な方法

ifstream ifile(filename);
if (ifile) {
  // The file exists, and is open for input
}
6
LI Xuhong

Statを使用できます。これは、プラットフォーム間で移植可能であり、標準Cライブラリにあります。

#include <sys/stat.h>

bool FileExists(string filename) {
    struct stat fileInfo;
    return stat(filename.c_str(), &fileInfo) == 0;
}

Statが0を返す場合、ファイル(またはディレクトリ)は存在しますが、そうでない場合は存在しません。ファイルのパスにあるすべてのディレクトリに対するアクセス許可が必要だと思います。移植性はテストしていませんが、 このページ は問題ではないことを示しています。

4
Erik Garrison

より良い方法:

std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);
1
user1633272