49

ファイルが空かどうかを確認する簡単な方法はありますか?たとえば、ファイルを関数に渡しているときに、ファイルが空であることに気付いた場合は、すぐに閉じますか?ありがとう。

編集、fseekメソッドを使用しようとしましたが、「ifstreamをFILE*に変換できません」というエラーが表示されます。

私の関数のパラメータは

myFunction(ifstream &inFile)
4

10 に答える 10

85

おそらく次のようなものです。

bool is_empty(std::ifstream& pFile)
{
    return pFile.peek() == std::ifstream::traits_type::eof();
}

短くて甘い。


エラーを懸念して、他の回答はCスタイルのファイルアクセスを使用しており、特定の機能を使用してを取得しFILE*ます。

逆に、あなたと私はC ++ストリームを使用しているため、これらの関数を使用することはできません。上記のコードは単純な方法で機能します。peek()ストリームをのぞき、削除せずに次の文字を返します。ファイルの終わりに達すると、を返しますeof()。エルゴ、私たちpeek()はストリームを見て、それがそうであるかどうかを確認しeof()ます。空のファイルには何も見ることがないからです。

これは、ファイルが最初に開かれなかった場合にもtrueを返すことに注意してください。これは、あなたの場合に機能するはずです。あなたがそれを望まない場合:

std::ifstream file("filename");

if (!file)
{
    // file is not open
}

if (is_empty(file))
{
    // file is empty
}

// file is open and not empty
于 2010-03-06T00:56:35.767 に答える
10

さて、このコードはあなたのために働くはずです。パラメータに合わせて名前を変更しました。

inFile.seekg(0, ios::end);  
if (inFile.tellg() == 0) {    
  // ...do something with empty file...  
}
于 2010-03-06T00:54:13.077 に答える
5

ファイルの最後までシークし、位置を確認します。

 fseek(fileDescriptor, 0, SEEK_END);
 if (ftell(fileDescriptor) == 0) {
     // file is empty...
 } else {
     // file is not empty, go back to the beginning:
     fseek(fileDescriptor, 0, SEEK_SET);
 }

ファイルをまだ開いていない場合は、fstat関数を使用してファイルサイズを直接確認してください。

于 2010-03-06T00:51:30.080 に答える
0
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
  fseek(pFile, 0, SEEK_SET);
  do something...
}

fclose(pFile)
于 2010-03-06T00:53:27.773 に答える