2012-03-09 14 views
11

sto usando C++ e XCode per creare una linea di app cmd per salvare i permessi dei file, ma non riesco a ottenere il metodo di spermatozoi() per essere identificato, l'errore èXCode C++ mancante spermatozoi()

'l'utilizzo di identificatore non dichiarato 'dello sperma'

mio include e il pezzo di codice in questione sono al di sotto ...

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

Vorrei Google per "man sperma" ... –

+0

Si prega di definire non funziona. Rispondere a quale nome di funzione wow! – Iznogood

+2

@OliCharlesworth: Penso che avrei paura di fare clic su una qualsiasi partita, specialmente sul lavoro! –

risposta

11

Questo potrebbe farmi sembrare un pervertito, ma ho cercato su google per "sperma" (ofcourse solo per .h e .cpp File). La cattiva notizia è che non riesco a trovare alcun riferimento ad essa (eccetto la pagina stat function stessa).

La buona notizia è che ho trovato this pezzo di codice che definisce il proprio funzione 'dello sperma':

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

utilizzo è semplice:

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

output sul ideone:

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

Anche io non sono al lavoro ed ero in grado di fare qualche ricerca su google, e ho trovato questo: http://answers.yahoo.com/question/index?qid=20091108232812AA2Vtb4 che fa riferimento a una funzione BeOS che fa la stessa cosa. – dantswain

+0

Ciao, grazie per aver trovato che, come una persona C++ del tutto nuova, ho avuto la possibilità di dirmi come potrei integrarlo nel mio codice. Su un'altra nota da aggiungere alle battute scherzose su questa particolare domanda, è davvero un vero peccato che la risposta di BJ Homer non abbia risposto alla domanda dello spermatozoo() in quanto sarebbe stata una giustizia poetica. – creativetechnologist

+0

@creativetechnologist Ho modificato la mia risposta per voi per vedere come usare questa funzione –

1

Supponendo che la funzione è definita (e io non ho intenzione di google quel nome dal lavoro), si ha un problema con il modo in cui si sta stampando è:

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

che non sta andando per stampare una stringa formattata, dal momento che iostreams C++ non funzionano come C di printf. Non si poteva neanche formattarlo:

cout << sperm(statbuf.st_mode); 

o utilizzare printf:

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

o fare un po 'jiggery-pokery con manipolatori iostream.

+0

Grazie, ha accettato la formattazione ha bisogno di guardare, ma la funzione viene ancora con 'Uso dell'identificatore non dichiarato' sperma ' – creativetechnologist

+0

OK, non posso aiutare con quello che ho paura. È necessario aggiornare la domanda per descrivere il problema. –

+0

Nessun problema, hai aggiornato la domanda come hai suggerito, grazie per il tuo contributo. – creativetechnologist

4

Mi sono imbattuto in questo un paio di anni fa. In questo momento non mi sento in punta di piedi con Google con quel particolare termine di ricerca, ma se ricordo male, la risposta è che sperm() è una funzione di sistema non standard disponibile su Solaris. Ma dal momento che non fa parte dello standard UNIX, non lo troverai su OS X.