2012-03-09 87 views
11

我使用C++和XCode中創建一個CMD行應用程序保存文件的權限,但我不能獲得精子()方法來識別,錯誤是的XCode C++缺失精子()

精子‘

我包括與片的代碼有問題「未聲明的標識符的使用’是下面...

// My includes ... 
#include <iostream> 
#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <string.h> 
#include <vector> 
#include <sys/stat.h> 
#include <dirent.h> 
#include <pwd.h> 
#include <grp.h> 
#include <time.h> 
#include <locale.h> 
#include <langinfo.h> 
#include <stdint.h> 

// Code fragment ... 

dp = opendir ("/var/someplace"); 
if (dp != NULL) 
{ 
    while ((ep = readdir (dp))) 
    { 

     oFile = new FileObject; 

     oFile->setName(ep->d_name); 
     oFile->setIsDirectory(ep->d_type == isFolder); 

     oFiles.push_back (*oFile);    
     // If it's a folder then we can get it's innards 

     if (stat(ep->d_name, &statbuf) == -1) 
      continue; 
     cout << "%10.10s", sperm(statbuf.st_mode); 

     iFile++; 
    } 



    closedir (dp); 
} 
else 
    perror ("Couldn't open the directory"); 
+37

我會Google爲「男性精子」... – 2012-03-09 17:57:24

+0

請定義不起作用。回答一個函數名稱哇! – Iznogood 2012-03-09 17:59:53

+2

@OliCharlesworth:我想我會害怕點擊任何比賽,特別是在工作中! – 2012-03-09 18:00:03

回答

11

這可能會讓我看起來像變態,但是我在谷歌搜索'精子'(只適用於.h和.cpp文件)。 壞消息是我找不到任何對它的引用(除了stat function頁面本身)。

好消息是,我發現this一段代碼,它定義了它自己的 '精' 功能:

char const * sperm(__mode_t mode) { 
    static char local_buff[16] = {0}; 
    int i = 0; 
    // user permissions 
    if ((mode & S_IRUSR) == S_IRUSR) local_buff[i] = 'r'; 
    else local_buff[i] = '-'; 
    i++; 
    if ((mode & S_IWUSR) == S_IWUSR) local_buff[i] = 'w'; 
    else local_buff[i] = '-'; 
    i++; 
    if ((mode & S_IXUSR) == S_IXUSR) local_buff[i] = 'x'; 
    else local_buff[i] = '-'; 
    i++; 
    // group permissions 
    if ((mode & S_IRGRP) == S_IRGRP) local_buff[i] = 'r'; 
    else local_buff[i] = '-'; 
    i++; 
    if ((mode & S_IWGRP) == S_IWGRP) local_buff[i] = 'w'; 
    else local_buff[i] = '-'; 
    i++; 
    if ((mode & S_IXGRP) == S_IXGRP) local_buff[i] = 'x'; 
    else local_buff[i] = '-'; 
    i++; 
    // other permissions 
    if ((mode & S_IROTH) == S_IROTH) local_buff[i] = 'r'; 
    else local_buff[i] = '-'; 
    i++; 
    if ((mode & S_IWOTH) == S_IWOTH) local_buff[i] = 'w'; 
    else local_buff[i] = '-'; 
    i++; 
    if ((mode & S_IXOTH) == S_IXOTH) local_buff[i] = 'x'; 
    else local_buff[i] = '-'; 
    return local_buff; 
} 

用法很簡單:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <iostream> 

int main(int argc, char ** argv) 
{ 
    std::cout<<sperm(S_IRUSR | S_IXUSR | S_IWGRP | S_IROTH)<<std::endl; 
    std::cout<<sperm(S_IRUSR)<<std::endl; 
    std::cout<<sperm(S_IRUSR | S_IRGRP | S_IWOTH | S_IROTH)<<std::endl; 
    return 0; 
} 

輸出上ideone

r-x-w-r-- 
r-------- 
r--r--rw- 
+0

我也沒有在工作,並能夠做一些谷歌搜索,並發現這一點:http://answers.yahoo.com/question/index?qid=20091108232812AA2Vtb4其中引用了一個BeOS功能,大約相同的事情。 – dantswain 2012-03-09 18:50:52

+0

嗨,感謝您發現,作爲一個非常新的C++人員,您可以告訴我如何將其整合到我的代碼中。 關於在這個特殊問題上添加幽默嘲笑的另一個注意事項,BJ Homer的迴應沒有回答精子()問題,因爲這將是詩意的正義,這真是一個很大的恥辱。 – creativetechnologist 2012-03-09 18:53:18

+0

@creativetechnologist我編輯了我的答案給你看看如何使用這個功能 – 2012-03-09 19:06:04

1

假設函數被定義(和我不會谷歌那個名字從工作),你有你打印的方式有問題:

cout << "%10.10s", sperm(statbuf.st_mode); 

那不是要打印的格式化字符串,因爲C++輸入輸出流並不像C的printf工作。你既可以對其進行格式化:

cout << sperm(statbuf.st_mode); 

或使用printf

printf("%10.10s", sperm(statbuf.st_mode)); 

或者做一些暗中搗鬼用的iostream操縱。

+0

謝謝,同意格式化需求看,但功能仍然提出'使用未聲明的標識符'精子' – creativetechnologist 2012-03-09 18:22:03

+0

好吧,我不能幫助,我害怕。您應該更新問題來描述問題。 – 2012-03-09 18:23:52

+0

不用擔心,根據您的建議更新了問題,謝謝您的意見。 – creativetechnologist 2012-03-09 18:26:38

4

幾年前我遇到過這個問題。我現在不喜歡用這個特定的搜索詞短語瀏覽Google,但如果我沒有記錯的話,答案是sperm()是Solaris上可用的非標準系統函數。但由於它不是unix標準的一部分,所以在OS X上找不到它。