[C / Win32] Uitvoer in verkeerde directory

Pagina: 1
Acties:

  • Robbbert
  • Registratie: April 2005
  • Laatst online: 20-02 09:46
Hallo,
Ik heb al veel programmaatjes in console met C geschreven met simpele uitvoer zoals bijvoorbeeld:
C:
1
2
3
FILE *uit;
uit = fopen("Frequentie.txt", "w");
fprintf(uit, "Totaal: %d\n", lengte);
Op deze manier komt het bestand Frequentie.txt standaard in dezelfde map als het programma zelf.

Maar nu ben ik bezig met een Win32 programma waarin de gebruiker tekst in een Editbox kan vullen door, of de tekst erin te plakken, of een tekstbestand te openen en in te voegen. Van alle letters in de Editbox wordt een frequentie analyse van de letters gemaakt en het resultaat wordt gelijk weggescheven in Frequentie.txt, met ongeveer dezelfde code als bovenstaande.

Wanneer ik tekst plak is er niets aan de hand, maar als ik een bestand open dan komt het uitvoerbestand in dezelfde map te staan als het geopende bestand en niet in de map van het programma.

Wat kan ik hier aan doen om het uitvoerbestand in de map van het programma te houden?

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21:55

BoAC

Memento mori

Het volledige pad opgeven, of zorgen dat het programma wordt opgestart vanuit de directorie van de executable (work directorie) :)

  • Robbbert
  • Registratie: April 2005
  • Laatst online: 20-02 09:46
Volledige pad opgeven heeft geen zin. Dat kan natuurlijk per gebruiker verschillen. Maar hoe zou ik dan moeten aangeven dat het bestand in dezelfde directory als het programma moet staan?

  • Gé Brander
  • Registratie: September 2001
  • Laatst online: 19-01 13:20

Gé Brander

MS SQL Server

%USERPROFILE% + '\applicatienaam\' + 'Frequentie.txt'

Dit zorgt ervoor dat bij iedere gebruiker het bestand in een 'eigen' directory komt. Iedere gebruiker heeft zijn eigen bestand.

Heb geen verstand van C maar een systeem variabele kan je daarvoor gebruiken. En %USERPROFILE% is een systeemvariabele.

[ Voor 32% gewijzigd door Gé Brander op 03-04-2006 22:48 ]

Vroeger was alles beter... Geniet dan maar van vandaag, morgen is alles nog slechter!


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 14-02 12:54
Het volledige pad hoef je ook niet vast op te geven. Denk eerder dat BoAC bedoelt dat je het volledige pad van je programma opvraagt en dan daar de bestandsnaam achter plakt.

Of zoals c70070540 zegt dat je het in de Documents&Settings op gaat slaan. Maar dan moet je eigenlijk ook wel de mogelijkheid bieden het weer automatisch op te ruimen.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:53
De user een directory laten selecteren?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Robbbert
  • Registratie: April 2005
  • Laatst online: 20-02 09:46
Maar hoe vraag ik dan het adres op waar het programma in staat? Ik heb al zat functies gevonden waarmee je het adres van de working directory kunt opvragen, maar dat moet ik nou juist niet hebben. Ik zoek naar iets als "GetProgramDir()" of "GetRootDir()" als zoiets bestaat.

  • kdekker
  • Registratie: Januari 2005
  • Niet online
Zie: GetModuleFileName().
En verder: environment variables met getenv(). Overigens zijn er kant-en-klare functies voor user dir te krijgen. Voor alles geldt: kijk eens op msdn.microsoft.com.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:53
Robbbert schreef op dinsdag 04 april 2006 @ 14:52:
Maar hoe vraag ik dan het adres op waar het programma in staat? Ik heb al zat functies gevonden waarmee je het adres van de working directory kunt opvragen, maar dat moet ik nou juist niet hebben. Ik zoek naar iets als "GetProgramDir()" of "GetRootDir()" als zoiets bestaat.
Waarom zou je dat nog willen weten dan? Als je de gebruiker een dir laat selecteren hoeft dat toch niet? Ik kan me voorstellen dat zo'n functie niet bestaat.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Robbbert
  • Registratie: April 2005
  • Laatst online: 20-02 09:46
Het is me gelukt!! :D

En wel op de volgende manier:
C:
1
2
3
4
5
6
7
8
9
10
11
12
char adres[512];
int i;
GetModuleFileName(0, adres, 512);
for (i = strlen(adres); i > 0; i--)
{
   if (adres[i] == 92) break;
}
strcpy(adres + i + 1, "Frequentie.txt");

FILE *uit;
uit = fopen(adres, "w");
fprintf(uit, "Totaal: %d\n", lengte);

Ik vraag dus het volledige adres van het programma op, maar dan moet de programmanaam veranderd worden in de naam van het uitvoerbestand. Dus ik zoek vanaf het eind van het adres naar de eerste backslash (92 in ascii). En daarachter plak ik dan de bestandsnaam.

Ik wil dit uitvoerbestand in dezelfde map als het programma zelf hebben zodat ik met andere programma's in dezelfde map dat bestand automatisch weer kan openen zonder te zoeken of de gebruiker er om te vragen.

  • Gé Brander
  • Registratie: September 2001
  • Laatst online: 19-01 13:20

Gé Brander

MS SQL Server

Robbbert schreef op dinsdag 04 april 2006 @ 16:36:
Het is me gelukt!! :D

En wel op de volgende manier:
C:
1
2
3
4
5
6
7
8
9
10
11
12
char adres[512];
int i;
GetModuleFileName(0, adres, 512);
for (i = strlen(adres); i > 0; i--)
{
   if (adres[i] == 92) break;
}
strcpy(adres + i + 1, "Frequentie.txt");

FILE *uit;
uit = fopen(adres, "w");
fprintf(uit, "Totaal: %d\n", lengte);

Ik vraag dus het volledige adres van het programma op, maar dan moet de programmanaam veranderd worden in de naam van het uitvoerbestand. Dus ik zoek vanaf het eind van het adres naar de eerste backslash (92 in ascii). En daarachter plak ik dan de bestandsnaam.

Ik wil dit uitvoerbestand in dezelfde map als het programma zelf hebben zodat ik met andere programma's in dezelfde map dat bestand automatisch weer kan openen zonder te zoeken of de gebruiker er om te vragen.
Klinkt heel mooi, maar denk aan omgevingen waar gebruikers geen schrijfrechten hebben in de program directory. Dan is het toch handiger om de environment variabele uit te lezen en het daar te plaatsen. Als je altijd die variabele + \Programmanaam\Frequentie.txt gebruikt heb je altijd je file te pakken.

Vroeger was alles beter... Geniet dan maar van vandaag, morgen is alles nog slechter!


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:27

Robtimus

me Robtimus no like you

Robbbert schreef op dinsdag 04 april 2006 @ 16:36:
C:
1
2
3
4
5
for (i = strlen(adres); i > 0; i--)
{
   if (adres[i] == 92) break;
}
strcpy(adres + i + 1, "Frequentie.txt");
Dude! Dat meen je niet!!
Je weet toch dat in C, C++ en Java elk array bij 0 begint??
Dus:
C:
1
2
3
4
for (i = strlen(adres) - 1; i >= 0; i--)
{
    if (adres[i] == '\\') break;
}
Of gebruik rindex (als die tenminste niet alleen onder Linux werkt) om de laatste occurrence te vinden van karakter '\\'.

Verder is die strcpy ook gevaarlijk: wat als Frequentie.txt langer is dan je app naam? Auch!

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Robbbert
  • Registratie: April 2005
  • Laatst online: 20-02 09:46
Ik moet toegeven dat deze snel in elkaar geflanste code geen schoonheidsprijsje ontvangt. Maar ik zie verder geen problemen :?

Het adres is volgens mij altijd wel korter dan de array adres[512]. Dus i = strlen(adres) geeft geen problemen.

"Verder is die strcpy ook gevaarlijk: wat als Frequentie.txt langer is dan je app naam? Auch!"
Die Frequentie.txt is langer dan de programmanaam, maar dat kan gewoon. Toch?

[ Voor 3% gewijzigd door Robbbert op 04-04-2006 17:02 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:27

Robtimus

me Robtimus no like you

Ik had idd de declaratie als array van 512 chars gemist, dus in de praktijk zal het niet snel fout gaan. Die eerste fout is daarom ook minder erg, maar theoretisch gezien wel fout omdat je je eerste element mist (al zal dat zelden / nooit een \ zijn).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Robbbert schreef op maandag 03 april 2006 @ 20:59:
Wanneer ik tekst plak is er niets aan de hand, maar als ik een bestand open dan komt het uitvoerbestand in dezelfde map te staan als het geopende bestand en niet in de map van het programma.
Dat is goed, en daar moet je niets aan willen doen. In een serieus OS heeft de gebruiker geen schrijfrechten in programma directories, maar alleen in zijn eigen werkdirectories. Windows XP is niet altijd even netjes daarin, maar Vista gaat veel strenger zijn.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1