ファイルが空かどうかを確認する簡単な方法はありますか。関数にファイルを渡していて、空であることに気付いたら、すぐに閉じますか?ありがとう。
編集、fseekメソッドを使用しようとしましたが、「ifstreamをFILE *に変換できません」というエラーが表示されます。
私の関数のパラメーターは
myFunction(ifstream &inFile)
おそらく次のようなもの:
_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
_
わかりましたので、このコードの一部はあなたのために動作するはずです。パラメータに合わせて名前を変更しました。
inFile.seekg(0, ios::end);
if (inFile.tellg() == 0) {
// ...do something with empty file...
}
ファイルの最後までシークし、位置を確認します。
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
関数を使用して、ファイルサイズを直接確認してください。
これを使用してください:data.peek()!= '\ 0'
最終的にこれが役立つまで、私は1時間探していました!
char ch;
FILE *f = fopen("file.txt", "r");
if(fscanf(f,"%c",&ch)==EOF)
{
printf("File is Empty");
}
fclose(f);
どうですか(エレガントな方法ではありませんが)
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;
}
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
fseek(pFile, 0, SEEK_SET);
do something...
}
fclose(pFile)