Fler dumma C++-frågor om bland annat miljövariabler (Linux) [LÖST]

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Fler dumma C++-frågor om bland annat miljövariabler (Linux) [LÖST]

Inlägg av Johnny Rosenberg »

Hej!

Håller på att öva lite på att läsa och skriva från och till filer. I de exempel jag tagit del av verkar det förutsättas att  läser rån och skriver till ligger i samma mapp som man startade programmet ifrån, vilket ju sällan är fallet. Frågan är då om man kan ange hela sökvägar istället för bara filnamn. Det kan ju verka lite vanskligt, eftersom man anger sökvägar på olika sätt i olika operativsystem, exempelvis att man använder / i Unix och Linux och \ i Windows och DOS. I och för sig är det oftast användaren som anger sökvägar på ett eller annat sätt i programmet, men ändå...

Och hur kommer man åt miljövariabler i C++? Anta att jag vill lägga en fil i /home/<användarnamn>, och det ska fungera oavsett vilken användare man är. Hur kommer jag då åt $HOME inifrån ett C++-program? Eller är det ~ som gäller?

Och för tillfället vald mapp verkar vara lagrad i $PWD, den skulle också vara intressant att komma åt. Kanske lika bra att veta hur man kommer åt ALLA miljövariabler, i och för sig...

J.R.
Senast redigerad av 1 DrMegahertz, redigerad totalt 31 gånger.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Fler dumma C++-frågor om bland annat miljövariabler (Linux)

Inlägg av Smygis »

man använder getenv som ligger i cstdlib.


smygis@Bob:~$ cat envtest.cpp
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *env = getenv("HOME");
    cout << env << endl;
}
smygis@Bob:~$ g++ -Wall envtest.cpp -o envtest
smygis@Bob:~$ chmod +x envtest
smygis@Bob:~$ ./envtest
/home/smygis
smygis@Bob:~$
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Fler dumma C++-frågor om bland annat miljövariabler (Linux)

Inlägg av Johnny Rosenberg »

Smygis skrev: man använder getenv som ligger i cstdlib.


smygis@Bob:~$ cat envtest.cpp
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *env = getenv("HOME");
    cout << env << endl;
}
smygis@Bob:~$ g++ -Wall envtest.cpp -o envtest
smygis@Bob:~$ chmod +x envtest
smygis@Bob:~$ ./envtest
/home/smygis
smygis@Bob:~$
Se där, snabbt svarat!

Och i de exempel man ofta ser på hur man läser och skriver till och från filer, kan man ersätta filnamn med sökvägar, eller? Eller med andra ord, är det tillåtet att skriva saker som MinFil.open("/home/guraknugen/MinFil.txt"); eller rent av MinFil.open("../../Blaha/MinAndraFil.dat");?

Om inte, hur gör man istället?

J.R.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

SV: Fler dumma C++-frågor om bland annat miljövariabler (Linux)

Inlägg av Lars »

Jodå, både relativa och absoluta sökvägar fungerar till open(), d.v.s. sökvägar som börjar på .. respektive /. Däremot kan man inte använda ~ direkt utan det måste översättas med t.ex. getenv("HOME"). Men man kan ju också få fram hemkatalogen med getpwent(), jag vet inte vad som är mest korrekt. Fördelen med getpwent() är att det fungerar med andra användare än den som kör programmet, så om man vill översätta t.ex. ~root så är det getpwent() som gäller.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Fler dumma C++-frågor om bland annat miljövariabler (Linux)

Inlägg av Johnny Rosenberg »

Är förresten inte cstdlib ett bibliotek som enbart finns till för kompatibilitet med C? Finns det inget "renodlat" C++-bibliotek med samma möjlighet?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Fler dumma C++-frågor om bland annat miljövariabler (Linux)

Inlägg av Smygis »

Johnny Rosenberg skrev: Är förresten inte cstdlib ett bibliotek som enbart finns till för kompatibilitet med C? Finns det inget "renodlat" C++-bibliotek med samma möjlighet?
Nej. Varför återuppfinna hjulet?
Senast redigerad av 1 Smygis, redigerad totalt 20 gånger.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Fler dumma C++-frågor om bland annat miljövariabler (Linux)

Inlägg av Johnny Rosenberg »

Bra fråga... :)
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"