C++ 在C++;
是否有一种简单的方法来检查文件是否为空。比如,如果您将一个文件传递给一个函数,并且您意识到它是空的,那么您会立即关闭它吗?谢谢 编辑时,我尝试使用fseek方法,但出现了一个错误,提示“无法将ifstream转换为文件*” 我的函数的参数是C++ 在C++;,c++,eof,C++,Eof,是否有一种简单的方法来检查文件是否为空。比如,如果您将一个文件传递给一个函数,并且您意识到它是空的,那么您会立即关闭它吗?谢谢 编辑时,我尝试使用fseek方法,但出现了一个错误,提示“无法将ifstream转换为文件*” 我的函数的参数是 myFunction(ifstream &inFile) 搜索到文件末尾并检查位置: fseek(fileDescriptor, 0, SEEK_END); if (ftell(fileDescriptor) == 0) { // f
myFunction(ifstream &inFile)
搜索到文件末尾并检查位置:
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
功能直接检查文件大小。查找文件末尾并检查位置:
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);
}
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
fseek(pFile, 0, SEEK_SET);
do something...
}
fclose(pFile)
如果您尚未打开文件,只需使用
fstat
功能直接检查文件大小。好的,这段代码应该适合您。我更改了名称以匹配您的参数
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
fseek(pFile, 0, SEEK_SET);
do something...
}
fclose(pFile)
inFile.seekg(0, ios::end);
if (inFile.tellg() == 0) {
// ...do something with empty file...
}
好的,这段代码应该适合您。我更改了名称以匹配您的参数
inFile.seekg(0, ios::end);
if (inFile.tellg() == 0) {
// ...do something with empty file...
}
也许类似于:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
又短又甜
考虑到您的错误,其他答案使用C风格的文件访问,您将获得一个带有特定函数的
文件*
相反,我们和C++流一起工作,因此不能使用这些函数。上述代码的工作方式很简单:
peek()
将查看流并返回下一个字符,而无需删除。如果到达文件末尾,则返回eof()
。因此,我们只需查看流,看看它是否是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
也许类似于:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
又短又甜
考虑到您的错误,其他答案使用C风格的文件访问,您将获得一个带有特定函数的
文件*
相反,我们和C++流一起工作,因此不能使用这些函数。上述代码的工作方式很简单:
peek()
将查看流并返回下一个字符,而无需删除。如果到达文件末尾,则返回eof()
。因此,我们只需查看流,看看它是否是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
(虽然不是优雅的方式)怎么样
intmain(intargc,char*argv[])
{
std::ifstream文件;
open(“example.txt”);
布尔是空的(真的);
std::字符串行;
while(文件>>行)
isEmpty=false;
std::cout怎么样(虽然不是优雅的方式)
intmain(intargc,char*argv[])
{
std::ifstream文件;
open(“example.txt”);
布尔是空的(真的);
std::字符串行;
while(文件>>行)
isEmpty=false;
std::coutif(nfile.eof())//来自启动读取的提示数据:
文件>>代码>>数量>>价格;
其他的
{
/*用于检查文件是否为空*/
ofileif(nfile.eof())//从启动读取的提示数据:
文件>>代码>>数量>>价格;
其他的
{
/*用于检查文件是否为空*/
文件使用以下内容:
data.peek()!='\0'
我已经搜索了一个小时,终于找到了帮助!使用此:
data.peek()!='\0'
我已经搜索了一个小时,终于找到了帮助!C++17解决方案:
#include <filesystem>
const auto filepath = <path to file> (as a std::string or std::filesystem::path)
auto isEmpty = (std::filesystem::file_size(filepath) == 0);
#包括
const auto filepath=(作为std::string或std::filesystem::path)
auto-isEmpty=(std::filesystem::file_size(filepath)==0);
假设您存储了文件路径位置,我认为您无法从std::ifstream
对象提取文件路径。C++17解决方案:
#include <filesystem>
const auto filepath = <path to file> (as a std::string or std::filesystem::path)
auto isEmpty = (std::filesystem::file_size(filepath) == 0);
#包括
const auto filepath=(作为std::string或std::filesystem::path)
auto-isEmpty=(std::filesystem::file_size(filepath)==0);
假设您存储了文件路径位置,我认为您无法从std::ifstream
对象提取文件路径。使用类似于“100110”的工具栏按钮格式化代码使用类似于“100110”的工具栏按钮格式化代码太糟糕了,您无法从fstream。在Unix上,使用fstat
可以很容易地检查空文件。:-PIt太糟糕了,你不能很容易地从fstream
中获取文件描述符。在Unix上,使用fstat
可以很容易地检查空文件。:-p添加返回pFile.tellg()并不难>0……/代码>不太难添加<代码>返回pFiel.TelgGe()> 0….. /代码>公平。稍微好一点(因为实际C++,而不是C)比user4471014,虽然仍然是完全浪费和次优的。@LightnessRacesinOrbit,你是对的,但是不需要遍历文件的所有行。一旦检测到第一行,while循环就可以停止,并将isEmpty
设置为false
。如果这可以增强代码,我可以理解这段代码是suboptimal但是为什么它是浪费的?OP没有要求或寻找足够的或优化的代码。(a)它是浪费的,因为你提取的数据永远不会使用。读取这些字符是毫无意义的。(b)只是因为OP没有特意要求“优化”代码并不意味着我们应该走相反的道路。)公平的说。它稍微好一点(因为是C++,而不是C)。比user4471014,虽然仍然是完全浪费和次优的。@LightnessRacesinOrbit,你是对的,但是不需要遍历文件的所有行。一旦检测到第一行,while循环就可以停止,并将isEmpty
设置为false
。如果这可以增强代码,我可以理解这段代码是subop蒂马尔,但为什么这样做是浪费?OP不是在询问或寻找苏