[C] fopen probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ik heb een probleem en kom er niet meer uit..
C:
1
2
3
4
5
6
7
uint8 serverid;
FILE *file;

// serverid
if((file = fopen("serverid", "r"))!=NULL) {
    fscanf(file, "%d", &serverid);
}


Hier wil ik dus in linux het bestand "serverid" openen in dezelfde directory. Dit lukt niet. Verander ik "serverid" in "/serverid" en zet ik het bestandje ook in / natuurlijk daar dan werkt het wel.

Wat zie ik hier over het hoofd of is het vreemd dat het niet werkt en is er iets anders aan de hand..? Het gaat dus mis in de regel fopen("serverid", "r").

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Normaliter weet je programma toch niet in welke directory hij draait?
Dat zal je eerst moeten opvragen.
en dan:
"ApplicatiePad\serverid"

[ Voor 3% gewijzigd door Armageddon_2k op 09-12-2010 12:25 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20-09 20:56

Creepy

Tactical Espionage Splatterer

Hoe run je je executable precies? Als "serverid" in dezelfde directory staat als de executable, maar je roept de executable aan vanaf een andere directory, dan gaat het niet werken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • lordgandalf
  • Registratie: Februari 2002
  • Laatst online: 19-09 15:33
probeer het eens met ./serverid ik vermoed dat je namelijk het volledige path moet opgeven daarom werk /serverid wel en serverid niet

Steam: Profile / Socialclub: Profile / Uplay: minedwarf / Origin: lordgandalf3


Acties:
  • 0 Henk 'm!

  • xx77qq
  • Registratie: Januari 2004
  • Niet online
Wat is 'dezelfde directory'?

Kijk eerst eens wat je 'current working directory' is met getcwd.
C:
1
2
3
char dirname[256];
getcwd(dirname, sizeof(dirname));
fprintf(stderr, "cwd: %s\n", dirname);

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Daarom heb je in Linux toch <unistd.h> en get_current_dir?

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
./serverid heb ik al geprobeerd dat was ook geen oplossing.

In veel voorbeeld vond ik het "serverid" op deze manier verhaal. Maar het probleem is waarschijnlijk die directory waarvan ik het oproep. Dat doe ik met /workspace/foo/bar/programma. Dus dan zoekt ie nu in / waarschijnlijk naar het bestand.

Bedankt voor de tips, ik kwam er even niet meer uit. get_current_dir had ik ook aangedacht maar ging ervan uit dat dit gewoon moest werken.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wellicht ten overvloede maar ik zie dat het nog niet exact gezegd is:

File operaties werken op basis van de huidige working directory, niet op basis van de dir waarin je executable staat. Als je de executable dus ergens in het pad zet (bijvoorbeeld "/bin") maar het runt vanuit een andere dir ("/home"), dan zal hij dus ook zoeken naar /home/serverid, en niet naar /bin/serverid.

De dir vinden van je executable lijkt niet echt triviaal (maar daarentegen heb ik zelf niet zo'n verstand van de linux API's)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Gratzip
  • Registratie: Oktober 2010
  • Laatst online: 26-09-2020
Als je dit doet, wordt er dan servtest.txt aangemaakt in dezelfde dir?

code:
1
2
3
4
5
6
7
8
9
10
11
uint8 serverid; 
FILE *file; 

file = fopen("servtest.txt","w");
fwrite ("test" , 1 , 4 , file );
fclose(file);

// serverid 
if((file = fopen("serverid", "r"))!=NULL) { 
    fscanf(file, "%d", &serverid); 
}

Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ik heb dus gekeken met getcwd();

Die is inderdaad zoals verwacht anders dan waar het programma draait en ik het bestandje eigenlijk vandaan wil halen.

Nu dus op zoek naar iets om de juiste directory te achterhalen of anders met een absoluut path werken.

Acties:
  • 0 Henk 'm!

  • xx77qq
  • Registratie: Januari 2004
  • Niet online
argv[0] bevat het path van de applicatie die je opstart, daar kan je iets mee

C:
1
2
3
4
5
int main(int argc, char *argv[])
{
   fprintf(stderr, "Gestart: %s\n", argv[0]);
   return 0;
}

Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 12:07
xx77qq schreef op donderdag 09 december 2010 @ 13:04:
argv\[0] bevat het path van de applicatie die je opstart, daar kan je iets mee

C:
1
2
3
4
5
int main(int argc, char *argv[])
{
   fprintf(stderr, "Gestart: %s\n", argv[0]);
   return 0;
}
Nee, daar heb je niets aan. Als je het programma opstart met './test', dan bevat argv[0] './test', start je hem op met '/usr/bin/test', dan bevat argv[0] '/usr/bin/test'. Je weet dan nog 0.0 over waar de executable staat. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Acties:
  • 0 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 15-09 16:33
dat ben ik niet met je eens, je weet genoeg om de file in die dir te kunnen vinden. Maakt niet uit of het een absoluut of relatief pad is.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jaap-Jan schreef op donderdag 09 december 2010 @ 13:11:
[...]
Nee, daar heb je niets aan. Als je het programma opstart met './test', dan bevat argv\[0] './test', start je hem op met '/usr/bin/test', dan bevat argv\[0] '/usr/bin/test'. Je weet dan nog 0.0 over waar de executable staat. :)
Als argv[0] met een / begint, dan is het het volledige pad. Als er een / in voorkomt, dan is hij relatief aan de CWD. Indien geen van beide, dan staat ie dus óf in CWD of in PATH :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
Als er geen slash in argv[0] staat dan staat het ding in het path, niet in de cwd óf het path. Het cwd kan natuurlijk ook in het path staan.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah ja, dat is op linux idd zo.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
Waarom schrijf je "op Linux?" Is het op andere Unixen niet zo? Of doel je op Windows?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Andere unixen? Linux is geen unix ;). Maar *nix dan. Bij Windows is het idd niet zo, en DOS en OS/2 warp ook niet, en ook BeOS niet dacht ik maar daar kan ik me in vergissen

[ Voor 46% gewijzigd door .oisyn op 09-12-2010 14:14 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Gratzip
  • Registratie: Oktober 2010
  • Laatst online: 26-09-2020
Nu dus op zoek naar iets om de juiste directory te achterhalen of anders met een absoluut path werken.
http://www.linuxquestions...ull-path-using-c-c-14510/

Hier staan wat mogelijkheden :)
Pagina: 1