2012-03-09 80 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上找不到它。