Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查文本文件是否为空或在c++;?_C++_File_Text Files_Ifstream - Fatal编程技术网

C++ 如何检查文本文件是否为空或在c++;?

C++ 如何检查文本文件是否为空或在c++;?,c++,file,text-files,ifstream,C++,File,Text Files,Ifstream,我编写了一个方法,它接收一个文件名,检查文件是否存在并包含内容,然后继续将文件中的6个数字读入6个int变量,并返回true。如果文件不存在或没有内容,则返回false 但是,当我调用该方法并给它一个存在的文件时,它返回false。我不确定哪里出了错 这是我的密码: bool readHSV(string the_file) { if(ifstream(the_file)){ fstream myfile(the_file, ios_base::in);

我编写了一个方法,它接收一个文件名,检查文件是否存在并包含内容,然后继续将文件中的6个数字读入6个
int
变量,并返回
true
。如果文件不存在或没有内容,则返回false

但是,当我调用该方法并给它一个存在的文件时,它返回false。我不确定哪里出了错

这是我的密码:

bool readHSV(string the_file)
{
    if(ifstream(the_file)){
        fstream myfile(the_file, ios_base::in);
        myfile >> h_min >> h_max >> s_min >> s_max >> v_min >> v_max;
        cout << h_min << endl << h_max << endl << s_min << endl << s_max
        << endl << v_min << endl << v_max;
        getchar();
        return true;
    }
    return false;
}
您可以这样使用

#include <filesystem>

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

// ...

bool func(std::string const& filename)
{
    if(!fs::exists(filename) || fs::file_size(filename) == 0)
        return false;

    std::ifstream ifs(filename);

    if(!ifs)
        return false;

    // do stuff here with ifs

    return true;
}
#包括
命名空间fs=std::filesystem;//简而言之
// ...
bool func(标准::字符串常量和文件名)
{
如果(!fs::exists(filename)| | fs::file_size(filename)==0)
返回false;
std::ifstream ifs(文件名);
如果(!ifs)
返回false;
//在这里用ifs做一些事情
返回true;
}

函数返回
false
的唯一方法是如果
ifstream(_文件)
失败,这意味着它根本无法打开该文件,不管它是否存在。如果文件确实存在,但ifstream仍然失败,请再次检查\u文件是否包含正确的路径和文件名,以及您的应用程序是否有权访问该文件

请注意,您将打开文件两次,一次是通过
ifstream
打开,另一次是通过
fstream
打开。你不需要那样做。您应该只打开该文件一次,如果能够从中读取所需的值,则返回true,例如:

bool readHSV(const string &the_file)
{
    ifstream inFile(the_file);
    if (inFile >> h_min >> h_max >> s_min >> s_max >> v_min >> v_max)
    {
        cout << h_min << endl
             << h_max << endl
             << s_min << endl
             << s_max << endl
             << v_min << endl
             << v_max;
        getchar();
        return true;
    }
    return false;
}
bool readHSV(常量字符串和_文件)
{
ifstream infle(_文件);
如果(填充>>h_最小值>>h_最大值>>s_最小值>>s_最大值>>v_最小值>>v_最大值)
{

这是否会在
exists()
file\u size()
ifstream
之间创建一个不必要的争用条件,如果
exists()
返回true,然后在调用
file\u size()
ifstream
之前移动/删除文件。您不需要
exists()
,因为如果文件不存在,
ifstream
无论如何都会失败。如果
ifstream
成功打开文件,那么文件显然存在,如果需要,您可以从中查询文件大小,或者干脆忽略大小并继续读取值并检查它们是否失败。@RemyLebeau Its仅供说明。@y、 它提供了现代的方法来回答两个OPs问题。但是关于竞争条件?你很可能在一个
>
调用和下一个调用之间得到这样的竞争条件。在大多数操作系统上,理论上,文件可以被其他进程从你脚下删除。但通常你控制对程序文件的访问am负责管理,否则用户有责任不删除他正在使用的同一个文件。1)在现代系统上,文件通常不会从文件系统中实际删除,直到文件的所有打开句柄都先关闭为止,2)标准库不允许这样做,但在某些系统上,您可以使用restri打开文件激活您打开文件时允许其他人对该文件做什么的权限,例如拒绝删除该文件的权限。@RemyLebeau自古以来,系统上就没有其他用户可以删除您的文件,因为操作系统不允许。因此,如果您的文件因您删除而被删除,则可能是因为标准库不允许真的很关心这个。谢谢你的回答!当我在函数中输入一个有效的文件时,它仍然返回false,即使它本应该返回true。这是我的文件的格式吗?我编辑了我的问题以显示文件的内容。再次感谢!“当我在函数中输入一个有效文件时,即使它应该返回true,它仍然返回false”-此代码只有两种失败方式:1)无法打开文件(
infle.is_open()
返回false),或2)无法从文件中读取整数(
infle.fail())
调用
操作符>>
)后返回true。“这是我的文件的格式吗?”-不应该是这样,因为
操作符>>
忽略空白,包括换行符。我看不出文件数据或读取代码有任何错误,因此您只需调试代码,以找出实际失败的地方。
bool readHSV(const string &the_file)
{
    ifstream inFile(the_file);
    if (inFile >> h_min >> h_max >> s_min >> s_max >> v_min >> v_max)
    {
        cout << h_min << endl
             << h_max << endl
             << s_min << endl
             << s_max << endl
             << v_min << endl
             << v_max;
        getchar();
        return true;
    }
    return false;
}