• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mac OS C++ Ścieżka do pliku

Aruba Cloud - Virtual Private Server VPS
0 głosów
413 wizyt
pytanie zadane 18 lipca 2020 w C i C++ przez Kxmil Nowicjusz (220 p.)
Mam pewien problem, googluje od kilku dni i nie mogę znaleźć rozwiązania. Mój plik exec o nazwie "x" znajduje się w folderze np. /Users/test_user/Code/ no i chcę, że by ten program po prostu wypisał to w terminalu. Już prawie do tego doszedłem, aczkolwiek program wypisywał ścieżkę /Users/test_user/Code/x .Dodam jeszcze, że używam Mac OS X. Czy moglibyście wytłumaczyć czego użyć lub napisać przykładowy kod? Dzięki

2 odpowiedzi

0 głosów
odpowiedź 18 lipca 2020 przez Falitac Użytkownik (860 p.)

W standardzie c++17 dodano ogólną bibliotekę <filesystem>. Jest tam funkcja do wypisywania aktualnej ścieżki programu:
https://en.cppreference.com/w/cpp/filesystem/current_path
Podczas kompilacji pamiętaj o fladze -std=c++17.

Jeśli chcesz otrzymać nazwę pliku wykonywalnego, to możesz użyć argumentu z main tj. argv[0]. Trzeba jednak z tym uważać, bo jeśli chodzi o bezpieczeństwo to łatwo zmienić wartość tej zmiennej.
https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean

Co prawda nie po polsku, ale skoro uczysz się programowania to angielski to must have i nic na to nie poradzisz.

0 głosów
odpowiedź 18 lipca 2020 przez tangarr Mędrzec (155,140 p.)

Pierwszym argumentem przekazanym do programu jest ścieżka pliku binarnego. Bardzo często jest ona względna wobec aktualnego katalogu roboczego, dlatego musisz użyć funkcji wyznaczającej absolutną ścieżkę (np. relpath). Na końcu musisz odrzucić ostatni człon uzyskanej ścieżki.
Przykładowa funkcja:
 

#include <limits.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>

std::string baseDir(const char *relativePath) {
    char *absolute = relpath(relativePath, nullptr);
    if (absolute == nullptr)
        return std::string();
    auto lastSlash = strrchr(absolute);
    if (lastSlash == nullptr) {
        std::string result(absolute);
        free(absolute);
        return result;
    }
    int len = lastSlash - absolute;
    std::string result(absolute, len);
    free(absolute);
    return result;
}

int main(int argc, char **argv) {
    std::cout << baseDir(argv[0]) << std::endl;
    return 0;
}

Pisałem z palca, bez kompilowania, więc kod może nie działać

komentarz 18 lipca 2020 przez j23 Mędrzec (195,240 p.)

W strrchr zapomniałeś o drugim argumencie.

Podobne pytania

0 głosów
2 odpowiedzi 1,205 wizyt
pytanie zadane 8 listopada 2016 w Systemy operacyjne, programy przez Graf Pas Początkujący (330 p.)
0 głosów
1 odpowiedź 379 wizyt
pytanie zadane 4 stycznia 2020 w C# przez assassin Gaduła (3,260 p.)
0 głosów
2 odpowiedzi 633 wizyt
pytanie zadane 14 lipca 2020 w C i C++ przez Kxmil Nowicjusz (220 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,663 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...