2014-04-30 43 views
0

我写一个函数来决定它是否是一个文件或不是,请参阅下面的代码:决定它是否是文件的非确定性行为?

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,我不知道这是用函数的问题。

回答

3

您不检查返回值stat,而是查看st.st_mode是否包含有效数据。所以,当stat失败,说因为该文件不存在,你处理无意义的数据。

+0

喜,可以将参数'pathname'在'stat'支持'/家庭/ A *'格式? – xunzhang

+1

当然,这将检查名为'/ home/a *'的文件。 –

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; 
} 
+0

如果文件系统在短时间内失败,此代码无法处理案例 – xunzhang

+0

谁说代码必须处理这样的错误? – codenheim

+0

因为在这种情况下它会返回false,但它是一个普通文件 – xunzhang