我正在尝试使用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,它会将我的好文件作为空文件。
答案 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;