C++ 在C++;

C++ 在C++;,c++,eof,C++,Eof,是否有一种简单的方法来检查文件是否为空。比如,如果您将一个文件传递给一个函数,并且您意识到它是空的,那么您会立即关闭它吗?谢谢 编辑时,我尝试使用fseek方法,但出现了一个错误,提示“无法将ifstream转换为文件*” 我的函数的参数是 myFunction(ifstream &inFile) 搜索到文件末尾并检查位置: fseek(fileDescriptor, 0, SEEK_END); if (ftell(fileDescriptor) == 0) { // f

是否有一种简单的方法来检查文件是否为空。比如,如果您将一个文件传递给一个函数,并且您意识到它是空的,那么您会立即关闭它吗?谢谢

编辑时,我尝试使用fseek方法,但出现了一个错误,提示“无法将ifstream转换为文件*”

我的函数的参数是

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::cout
if(nfile.eof())//来自启动读取的提示数据:
文件>>代码>>数量>>价格;
其他的
{
/*用于检查文件是否为空*/
ofile
if(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不是在询问或寻找苏