在C++中检查空文件

Cry*_*tal 37 c++ eof

有没有一种简单的方法来检查文件是否为空.就像你将一个文件传递给一个函数并且你意识到它是空的一样,那么你马上关闭它?谢谢.

编辑,我尝试使用FSEEK方法,但我得到一个错误说"不能转换到ifstream的FILE*".

我的函数的参数是

myFunction(ifstream &inFile)
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 69

也许类似于:

bool is_empty(std::ifstream& pFile)
{
    return pFile.peek() == std::ifstream::traits_type::eof();
}
Run Code Online (Sandbox Code Playgroud)

简短又甜蜜.


考虑到您的错误,其他答案使用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
Run Code Online (Sandbox Code Playgroud)

  • @ViktorStefanov 不,如果文件以空行开头怎么办? (2认同)

paj*_*ton 8

好的,所以这段代码应该适合你.我更改了名称以匹配您的参数.

inFile.seekg(0, ios::end);  
if (inFile.tellg() == 0) {    
  // ...do something with empty file...  
}
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 6

寻找文件的末尾并检查位置:

 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);
 }
Run Code Online (Sandbox Code Playgroud)

如果您尚未打开文件,只需使用该fstat功能并直接检查文件大小.