Esiste un equivalente in C ++ per getcwd?

Vedo C’s getcwd tramite: man 3 cwd

Sospetto che C ++ abbia uno simile, che potrebbe restituirmi una stringa std ::.

In tal caso, come si chiama e dove posso trovare la documentazione?

Grazie!

    Ok, sto rispondendo anche se hai già accettato una risposta.

    Un modo ancora migliore di racchiudere la chiamata getcwd è utilizzare boost :: filesystem , dove si ottiene un object path dalla funzione current_path() . La libreria del filesystem Boost ti permette di fare molte altre cose utili che altrimenti dovresti fare un sacco di parsing di stringhe, come controllare se esistono file / directory, ottenere il percorso genitore, rendere i percorsi completi eccetera. Controllalo, è anche portatile – il che molto probabilmente non sarà il codice di parsing di stringhe che verrebbe altrimenti usato.

    Aggiornamento (2016): il filesystem è stato pubblicato come specifica tecnica nel 2015, basato su Boost Filesystem v3. Ciò significa che potrebbe essere già disponibile con il compilatore (ad esempio Visual Studio 2015). A me sembra anche probabile che diventerà parte di un futuro standard C ++ (assumerei C ++ 17, ma non sono a conoscenza dello stato attuale).

    Aggiornamento (2017): la libreria del filesystem è stata unita a ISO C ++ in C ++ 17, per

     std::filesystem::current_path(); 

    Il costruttore di std::string può tranquillamente prendere un char* come parametro. Sorprendentemente c’è anche una versione per Windows .

    Modifica: in realtà è un po ‘più complicato:

     std::string get_working_path() { char temp[MAXPATHLEN]; return ( getcwd(temp, MAXPATHLEN) ? std::string( temp ) : std::string("") ); } 

    La memoria non è un problema – temp è un buffer basato su stack e il costruttore std :: string ne fa una copia. Probabilmente potresti farlo in un colpo solo, ma non credo che lo standard lo garantirebbe.

    Informazioni sull’allocazione della memoria, tramite POSIX:

    La funzione getcwd () deve posizionare un percorso assoluto della directory di lavoro corrente nell’array puntato da buf e restituire buf. Il nome percorso copiato nell’array non deve contenere componenti che sono collegamenti simbolici. L’argomento dimensione è la dimensione in byte della matrice di caratteri indicata dall’argomento buf. Se buf è un puntatore nullo, il comportamento di getcwd () non è specificato.

    Proviamo a riscrivere questa semplice chiamata in C come C ++:

     std::string get_working_path() { char temp [ PATH_MAX ]; if ( getcwd(temp, PATH_MAX) != 0) return std::string ( temp ); int error = errno; switch ( error ) { // EINVAL can't happen - size argument > 0 // PATH_MAX includes the terminating nul, // so ERANGE should not be returned case EACCES: throw std::runtime_error("Access denied"); case ENOMEM: // I'm not sure whether this can happen or not throw std::runtime_error("Insufficient storage"); default: { std::ostringstream str; str << "Unrecognised error" << error; throw std::runtime_error(str.str()); } } } 

    Il fatto è che quando si avvolge una funzione di libreria in un'altra funzione si deve presupporre che tutte le funzionalità dovrebbero essere esposte, perché una libreria non sa come la chiamerà. Quindi devi gestire i casi di errore piuttosto che inghiottirli o sperare che non succedano.

    Di solito è meglio lasciare che il codice client chiami semplicemente la funzione di libreria e gestisca l'errore a quel punto - il codice cliente probabilmente non si preoccupa del perché si è verificato l'errore, e quindi deve solo gestire il caso pass / fail, piuttosto che tutti i codici di errore

    Dovrai solo scrivere un piccolo involucro.

     std::string getcwd_string( void ) { char buff[PATH_MAX]; getcwd( buff, PATH_MAX ); std::string cwd( buff ); return cwd; } 

    Tutte le funzioni C sono anche funzioni C ++. Se hai bisogno di una std::string , creane una dal char* che getcwd prende per te.

    Ho usato getcwd() in C nel modo seguente:

     char * cwd; cwd = (char*) malloc( FILENAME_MAX * sizeof(char) ); getcwd(cwd,FILENAME_MAX); 

    Il file di intestazione necessario è stdio.h . Quando uso il compilatore C, funziona perfettamente.

    Se compilo esattamente lo stesso codice usando il compilatore C ++, riporta il seguente messaggio di errore:

     identifier "getcwd" is undefined 

    Quindi ho incluso unistd.h e compilato con il compilatore C ++. Questa volta, tutto funziona. Quando torno al compilatore C, funziona ancora!

    Finché si includono sia stdio.h che unistd.h , il codice sopra funziona per i compilatori C AND C ++.

    Ho anche usato boost :: filesystem come indicato in un’altra risposta sopra. Volevo solo aggiungere che dal momento che la funzione current_path () non restituisce uno std :: string, devi convertirlo.

    Ecco cosa ho fatto:

     std::string cwd = boost::filesystem::current_path().generic_string(); 

    Potresti creare una nuova funzione, che preferirei per il collegamento a una libreria come boost (a meno che tu non lo sia già).

      std::string getcwd() { char* buff;//automatically cleaned when it exits scope return std::string(getcwd(buff,255)); }