Kezdőlap › Fórumok › Programozás › User mappájába fájl létrehozás c++ban
- This topic has 30 hozzászólás, 6 résztvevő, and was last updated 17 years, 9 months telt el by
gabaman.
-
SzerzőBejegyzés
-
2007-10-12-16:15 #2137226
„de mivel ez felhasználóként változik”
Gondolom a „home”-ra gondolsz… man getenv(3).
Ha valami „extra” helyről van szó, akkor egy adott helyen lévő konfigurációs file-ban kell tárolni…2007-10-12-16:15 #2137227„de mivel ez felhasználóként változik”
Gondolom a „home”-ra gondolsz… man getenv(3).
Ha valami „extra” helyről van szó, akkor egy adott helyen lévő konfigurációs file-ban kell tárolni…2007-10-12-17:10 #2137228Köszi, összejött!
A következő kérdésem inkább érdekes jellegű lenne.
Az előbbiekben említett getenv visszatérési értékét egy char mutatóban tárolom. Ehhez hozzáfűzőm a szűkséges karakterláncot, ami az elérési út további része. Elrendezem a fájlműveleteket, lezárom. De nekem még szükségem van a elérési útra, mert a fájlműveletekben egy .sh fájlt hoztam létre, amit chmod +x paranccsal kellene futtathatóvá tenni. Ezt úgy oldanám meg, hogy egy következő változóhoz hozzáfűzném a „chmod +x ” láncot, aztán az elérési utat, majd a változót a system függvénybe rakva elérem a célom. Megmutatom a kódot, hogy nagyjából lássátok mier gondolok:char futtatas[40]=””;
char *home;home = getenv(„HOME”);
strcat(home,”/.kde/Autostart/valami.sh”);
sfile=fopen(home,”w+”);
fputs(szoveg,sfile);
fclose(sfile);strcat(futtatas,”chmod +x „);
strcat(futtatas,home);
system(futtatas);Nos. Miért van az, hogy csak akkor képes lefutni a system függvény, ha a futtatas változót az adott módon definiálom/deklarálom?
2007-10-12-17:10 #2137229Köszi, összejött!
A következő kérdésem inkább érdekes jellegű lenne.
Az előbbiekben említett getenv visszatérési értékét egy char mutatóban tárolom. Ehhez hozzáfűzőm a szűkséges karakterláncot, ami az elérési út további része. Elrendezem a fájlműveleteket, lezárom. De nekem még szükségem van a elérési útra, mert a fájlműveletekben egy .sh fájlt hoztam létre, amit chmod +x paranccsal kellene futtathatóvá tenni. Ezt úgy oldanám meg, hogy egy következő változóhoz hozzáfűzném a „chmod +x ” láncot, aztán az elérési utat, majd a változót a system függvénybe rakva elérem a célom. Megmutatom a kódot, hogy nagyjából lássátok mier gondolok:char futtatas[40]=””;
char *home;home = getenv(„HOME”);
strcat(home,”/.kde/Autostart/valami.sh”);
sfile=fopen(home,”w+”);
fputs(szoveg,sfile);
fclose(sfile);strcat(futtatas,”chmod +x „);
strcat(futtatas,home);
system(futtatas);Nos. Miért van az, hogy csak akkor képes lefutni a system függvény, ha a futtatas változót az adott módon definiálom/deklarálom?
2007-10-12-17:33 #2137230nanobit wrote:Sziasztok! Sajnos csak nem régóta tudok foglalkozni a C++ rejtelmeivel.nanobit wrote:char *home;home = getenv(„HOME”);
strcat(home,”/.kde/Autostart/valami.sh”);No igen, ilyen szőrnyűségek akkor keletkeznek, amikor valaki C++ stílusban akar C nyelven programozni. A „char*” visszatérési típus nem sztringet ad vissza (mint a C++ std::string típusa), hanem karakterlánccal feltöltött fix méretű memóriatömböt. Így nem fűzhetsz hozzá semmit, mert a lefoglalt memória utáni területre fogsz írni. Mellesleg a 40 byte hosszú tömb nem bizos, hogy elég. Ha meg nincs ellenőrzés a getenv() után, akkor lehet hogy a gyökér könyvtárba fogsz írni…
Code:char futtatas[100]=””;
char fajlnev[100]=””;
char *home;home = getenv(„HOME”);
if (home == NULL) {
printf(„A $HOME környezeti változó tartalma ismeretlen!”);
return FALSE;
}
strcat(fajlnev,home);
strcat(fajlnev,”/.kde/Autostart/valami.sh”);
sfile=fopen(fajlnev,”w+”);
fputs(szoveg,sfile);
fclose(sfile);strcat(futtatas,”chmod +x „);
strcat(futtatas,fajlnev);
system(futtatas);2007-10-12-17:33 #2137231nanobit wrote:Sziasztok! Sajnos csak nem régóta tudok foglalkozni a C++ rejtelmeivel.nanobit wrote:char *home;home = getenv(„HOME”);
strcat(home,”/.kde/Autostart/valami.sh”);No igen, ilyen szőrnyűségek akkor keletkeznek, amikor valaki C++ stílusban akar C nyelven programozni. A „char*” visszatérési típus nem sztringet ad vissza (mint a C++ std::string típusa), hanem karakterlánccal feltöltött fix méretű memóriatömböt. Így nem fűzhetsz hozzá semmit, mert a lefoglalt memória utáni területre fogsz írni. Mellesleg a 40 byte hosszú tömb nem bizos, hogy elég. Ha meg nincs ellenőrzés a getenv() után, akkor lehet hogy a gyökér könyvtárba fogsz írni…
Code:char futtatas[100]=””;
char fajlnev[100]=””;
char *home;home = getenv(„HOME”);
if (home == NULL) {
printf(„A $HOME környezeti változó tartalma ismeretlen!”);
return FALSE;
}
strcat(fajlnev,home);
strcat(fajlnev,”/.kde/Autostart/valami.sh”);
sfile=fopen(fajlnev,”w+”);
fputs(szoveg,sfile);
fclose(sfile);strcat(futtatas,”chmod +x „);
strcat(futtatas,fajlnev);
system(futtatas);2007-10-12-17:41 #2137232Mármint mire gondolsz? (Mikor nem? „char * futtatas” helyfoglalás nélkül, ahogy gabaman írta?)
Egyébként szükségtelen a system, lásd.: chmod(2), chmod(3p).2007-10-12-17:41 #2137233Mármint mire gondolsz? (Mikor nem? „char * futtatas” helyfoglalás nélkül, ahogy gabaman írta?)
Egyébként szükségtelen a system, lásd.: chmod(2), chmod(3p).2007-10-12-17:48 #2137234Szörnyű!
Nem akarok C-ben programozni amíg élek!🙂
2007-10-12-17:48 #2137235Szörnyű!
Nem akarok C-ben programozni amíg élek!🙂
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz