web-dev-qa-db-ja.com

C ++で空のファイルを確認する

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

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

私の関数のパラメーターは

myFunction(ifstream &inFile)
37
Crystal

おそらく次のようなもの:

_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
_
68
GManNickG

わかりましたので、このコードの一部はあなたのために動作するはずです。パラメータに合わせて名前を変更しました。

inFile.seekg(0, ios::end);  
if (inFile.tellg() == 0) {    
  // ...do something with empty file...  
}
8
pajton

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

 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関数を使用して、ファイルサイズを直接確認してください。

6
Mehrdad Afshari

これを使用してください:data.peek()!= '\ 0'

最終的にこれが役立つまで、私は1時間探していました!

1
Vytaute
char ch;
FILE *f = fopen("file.txt", "r");

if(fscanf(f,"%c",&ch)==EOF)
{
    printf("File is Empty");
}
fclose(f);
1
user4471014

どうですか(エレガントな方法ではありませんが)

int main( int argc, char* argv[] )
{
    std::ifstream file;
    file.open("example.txt");

    bool isEmpty(true);
    std::string line;

    while( file >> line ) 
        isEmpty = false;

        std::cout << isEmpty << std::endl;
}
0
CroCo
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
  fseek(pFile, 0, SEEK_SET);
  do something...
}

fclose(pFile)
0
sizzzzlerz