决定它是否是文件时的非确定性行为?

时间:2014-04-30 03:07:33

标签: c++ c regex file

我编写了一个函数来判断它是否是一个文件,请参阅下面的代码:

bool isfile(const std::string & f) {
  struct stat st;
  stat(f.c_str(), & st);
  if(S_ISREG(st.st_mode)) {
    return true;
  } 
  return false;
}

但是当我用:

调用函数时
std::cout << isfile("/home/xxx/a*") << std::endl;

/home/xxx/中,有一些a0,a1 ......和其他文件。

奇怪的问题是,它会主要打印0,但有时会打印1,我不知道该功能是否存在问题。

2 个答案:

答案 0 :(得分:3)

您不会检查stat的返回值,而是查看st.st_mode是否包含有效数据。因此,当stat失败时,例如因为该文件不存在,您将处理无意义的数据。

答案 1 :(得分:0)

注意,该标准适用于UNIX系统调用和C库调用,成功时返回0,失败时返回负数。正如David Schwartz指出的那样,你的代码忽略了这一点。

我建议:

bool isfile(const std::string & f) {
   struct stat st;
   if(stat(f.c_str(), & st) == 0 && S_ISREG(st.st_mode))
      return true;
   return false;
}