如何在C ++中检测空文件?

时间:2014-10-07 04:11:37

标签: c++ error-handling fstream

我正在尝试使用eof和peek,但两者似乎都没有给我正确的答案。

if (inputFile.fail()) //check for file open failure
{
    cout << "Error opening file" << endl;
    cout << "Note that the program will halt" << endl;//error prompt
}

else if (inputFile.eof())
{
    cout << "File is empty" << endl;
    cout << "Note that program will halt" << endl; // error prompt
}
else
{
    //run the file
}

使用此方法无法检测到任何空文件。如果我使用inputFile.peek而不是eof,它会将我的好文件作为空文件。

4 个答案:

答案 0 :(得分:8)

使用peek,如下所示

if ( inputFile.peek() == std::ifstream::traits_type::eof() )
{
   // Empty File

}

答案 1 :(得分:2)

我会在最后打开文件,看看那个位置使用tellg()

std::ifstream ifs("myfile", std::ios::ate); // std::ios::ate means open at end

if(ifs.tellg() == 0)
{
    // file is empty
}

函数tellg()返回文件的读取(get)位置,我们使用std::ios::ate在末尾打开带有读取(get)位置的文件。因此,如果tellg()返回0,则必须为空。

更新:从C++17开始,您可以使用std::filesyatem::file_size

#include <filesystem>

namespace fs = std::filesystem; // for readability

// ...

if(fs::file_size(myfile) == 0)
{
    // file is empty
}

注意:有些编译器已经将<filesystem>库作为Technical Specification支持(例如,GCC v5.3)。

答案 2 :(得分:2)

如果“空”表示文件的长度为零(即根本没有字符),那么只需查找文件的长度并查看它是否为零:

inputFile.seekg (0, is.end);
int length = is.tellg();

if (length == 0)
{
    // do your error handling
}

答案 3 :(得分:0)

ifstream fin("test.txt");
if (inputFile.fail()) //check for file open failure
{
    cout << "Error opening file" << endl;
    cout << "Note that the program will halt" << endl;//error prompt
}
int flag=0;
while(!fin.eof())
{
char ch=(char)fin.get();
flag++;
break;
}
if (flag>0)
cout << "File is not empty" << endl;
else
cout << "File is empty" << endl;