2014-04-30 72 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