2012-03-09 14 views
11

Używam C++ i XCode stworzyć cmd aplikację linii zapisać uprawnienia do plików, jednak nie mogę się metodę plemników(), aby zidentyfikować, błąd jestXCode C++ brakuje plemników()

„Wykorzystanie nielegalnej identyfikator«spermy»

My obejmuje i kawałek kodu w pytaniu są poniżej ...

// 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

Będę Google "sperma człowieka" ... –

+0

Proszę określić nie działa. Odpowiedz, co to jest nazwa funkcji! – Iznogood

+2

@OliCharlesworth: Sądzę, że bałem się kliknąć na dowolny mecz, szczególnie w pracy! –

Odpowiedz

11

To może sprawić, żebym wyglądał jak zboczeniec, ale szukałem google dla 'spermy' (ofcourse tylko dla .h i .cpp akta). Złą wiadomością jest to, że nie mogę znaleźć żadnych odniesień do niej (z wyjątkiem samej strony stat function).

Dobrą wiadomością jest to, znalazłem this kawałek kodu, który określa swój własny 'sperma' funkcja:

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

użycie jest proste:

#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; 
} 

wyjście na ideone:

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

Nie jestem również w pracy i udało mi się google, i znalazłem to: http://answers.yahoo.com/question/index?qid=20091108232812AA2Vtb4, który odwołuje się do funkcji BeOS, która robi o tym samym. – dantswain

+0

Cześć, dziękuję za stwierdzenie, że jako całkiem nowa osoba w C++ masz szansę powiedzieć mi, jak mogę ją zintegrować z moim kodem. Kolejna uwaga, dodająca do żartobliwego przekomarzania się na to konkretne pytanie, to naprawdę wielka szkoda, że ​​odpowiedź BJ Homera nie odpowiedziała na pytanie spermy(), ponieważ byłaby to poetycka sprawiedliwość. – creativetechnologist

+0

@creativetechnologist Edytowałem dla ciebie odpowiedź, aby zobaczyć, jak korzystać z tej funkcji –

1

Zakładając, że funkcja jest zdefiniowana (a ja nie jadę do google to imię od pracy), masz problem z okazji drukujesz go:

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

To nie będzie drukować sformatowany ciąg, ponieważ C++ iostreams nie działają jak C na printf. Albo nie mógł sformatować go:

cout << sperm(statbuf.st_mode); 

lub użyj printf:

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

lub zrobić kilka cygaństwo manipulatory iostream.

+0

Dzięki, zgodzili się, że formatowanie wymaga obejrzenia, ale funkcja nadal wyświetla komunikat "Używanie niezadeklarowanego identyfikatora" – creativetechnologist

+0

OK, nie mogę temu zapobiec. Powinieneś zaktualizować pytanie, aby opisać problem. –

+0

Bez obaw, zaktualizowałem pytanie zgodnie z sugestią, dzięki za Twój wkład. – creativetechnologist

4

Wpadłem na to kilka lat temu. Nie mam ochoty przechodzić przez Google w tym momencie, ale jeśli dobrze pamiętam, odpowiedź jest taka, że ​​sperm() to niestandardowa funkcja systemowa dostępna w systemie Solaris. Ale ponieważ nie jest to częścią standardu unix, nie znajdziesz go na OS X.