2012-03-09 2 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 для «спермы человека» ... –

+0

Пожалуйста, определите, не работает. Ans, какое имя функции wow! – Iznogood

+2

@OliCharlesworth: Думаю, я боюсь нажать на любой из матчей, особенно на работе! –

ответ

11

Это может сделать меня похожим на извращенца, но я искал google для 'sperm' (конечно же только для .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

+0

Привет, спасибо, что нашел, что, как совершенно новый человек на C++, вы могли бы рассказать мне, как я могу интегрировать это в свой код. На другой ноте, чтобы добавить к юмористическому подшучиванию по этому конкретному вопросу, действительно очень обидно, что ответ от BJ Гомера не ответил на вопрос спермы(), поскольку это было бы поэтическим правосудием. – creativetechnologist

+0

@creativetechnologist Я отредактировал свой ответ для вас, чтобы узнать, как использовать эту функцию –

1

Предполагая, что функция определена (и я не собираюсь Google это имя от работы), у вас есть проблема с тем, как вы печатаете его:

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

Это не собирается печатать отформатированную строку, так как C++ iostreams не работают, как Кассиопеяне printf. Вы можете или не форматировать его:

cout << sperm(statbuf.st_mode); 

или использовать printf:

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

или сделать некоторые козни с iostream манипуляторов.

+0

Спасибо, согласился с необходимостью форматирования, но функция все еще встречается с «использованием незаявленного идентификатора» sperm ' – creativetechnologist

+0

Хорошо, я не могу с этим боюсь. Вы должны обновить вопрос, чтобы описать проблему. –

+0

Не беспокойтесь, обновили вопрос, как вы предложили, спасибо за ваш вклад. – creativetechnologist

4

Я столкнулся с этим пару лет назад. Я не чувствую себя на цыпочках через Google с этим конкретным поисковым термином на данный момент, но если я правильно помню, ответ заключается в том, что sperm() - это нестандартная системная функция, доступная на Solaris. Но так как это не часть стандарта unix, вы не найдете его на OS X.

Смежные вопросы