C++ 如何检查文本文件是否为空或在c++;?
我编写了一个方法,它接收一个文件名,检查文件是否存在并包含内容,然后继续将文件中的6个数字读入6个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);
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;
}