• 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

Object Storage Arubacloud
0 głosów
335 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 (154,860 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 (194,920 p.)

W strrchr zapomniałeś o drugim argumencie.

Podobne pytania

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

92,690 zapytań

141,603 odpowiedzi

320,098 komentarzy

62,050 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...