[C] String opbouwen tot filenaam*

Pagina: 1
Acties:

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 26-04 20:53

Emiel1984

Made in NL

Topicstarter
Het programma dat ik aan het maken ben moet op een zeker punt een lijst gaan weergeven van producten. De producten staan in textfiles elk apart op de computer.

Om de file te openen voor lezen gebruiken we;
code:
1
fopen("file.txt","r");

Ik zou graag de te openen file met een variabele willen combineren, dus;

code:
1
fopen("file"(getal1)(getal2)".txt","r");

Dit wou ik oplossen met de methode;

code:
1
2
3
4
5
6
7
8
strcopy(acLink, "file");
strcat(acLink, acGetal1);
strcat(acLink, acGetal2);
strcat(acLink, ".txt");

pLink=acLink;

fopen(acLink, "r");

Helaas werkt dit niet. De opbouw werkte wel want zodra ik bij getal1 "0" invul en bij getal 2 "1",
werkt het programma goed alleen laat hij maar een enkele file-inhoud zien.

Als je hier kijkt zie je dat het wel zou moeten kunnen; Klik :?

Het probleem is dus hoe ik in het gereserveerde geheugen , achter file de getallen kan zetten.

Iemand een idee ? Ik ben een beetje radeloos geworden na een paar uur flink proberen te zoeken na andere oplossingen zonder resultaat. Ik heb het idee dat dus de functie strcat vervangen moet worden door een andere functienaam, de vraag is welke.

Edit;

Ik werk in VI compiler van linux (knoppix4);

[ Voor 50% gewijzigd door Emiel1984 op 24-10-2005 12:56 ]

[LTS][MTS][HTS]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

[google=c# string concatenation] lijkt me meer dan genoeg op te leveren? :)

Je probleem heeft eigenlijk niets met het lezen van files te maken, dus ik pas je titel even aan.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 26-04 20:53

Emiel1984

Made in NL

Topicstarter
-NMe- schreef op maandag 24 oktober 2005 @ 01:15:
[google=c# string concatenation] lijkt me meer dan genoeg op te leveren? :)

Je probleem heeft eigenlijk niets met het lezen van files te maken, dus ik pas je titel even aan.
Thks ga morgen meteen kijken :), net al effe gedaan maar kan niet logisch meer nadenken op dit moment :P .

[LTS][MTS][HTS]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

C#:
1
2
3
int getal1 = 5;
int getal2 = 3;
string filepath = @"c:\myfolder\file" + getal1 + getal2 + ".txt";


Je wilt overigens C++ code gaan compilen met een compileren voor C#.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
Wat heeft de code die jij post te maken met C# ? :?
Da's gewoon C.

Als je toch C# gebruikt, kan je eens kijken naar de Path class en z'n static members, maar als ik de code die je post bekijk, dan betwijfel ik dat toch heel sterk. :P
Ff de # uit de titel gehaald dus [C#] -> [C]

[ Voor 29% gewijzigd door whoami op 24-10-2005 11:31 ]

https://fgheysels.github.io/


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Als het C is kun je zoiets doen (uit de sprintf man page)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <math.h>

int main(int argc, char **argv) {
        int getal1 = 10;
        int getal2 = 123;
        char *str;
        int len = strlen("file.txt");

        len += get_int_length(getal1)+get_int_length(getal2)+1;

        // 1 is voor 0 byte
        str = (char *)malloc(len+1);
        memset(str,0x0,len+1);

        snprintf(str,len,"file%d%d.txt",getal1,getal2);

        printf("str: %s\n",str);

        return 0;
}

int get_int_length(int integer) {
        int l = 0;

        while(pow(10,++l) <= integer);

        return l++;
}

Edit iets betere versie zonder vsnprintf. Deze checkt eerst de lengte van de integer en alloceert dan een string die lang genoeg is.
Ik weet niet of dit ook op Windows werkt (aangezien je msdn pagina's aangeeft) maar het is te proberen.

[ Voor 70% gewijzigd door MTWZZ op 24-10-2005 09:44 ]

Nu met Land Rover Series 3 en Defender 90


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh, waarom heeft iedereen het überhaupt over C#? Ik zie geen letter C# in de topic :?
.edit: @whoami: ah ok :)
emiel1984 schreef op zondag 23 oktober 2005 @ 23:39:
Helaas werkt dit niet. De opbouw werkte wel want zodra ik bij getal1 "0" invul en bij getal 2 "1",
werkt het programma goed alleen laat hij maar een enkele file-inhoud zien.
Je kunt met strcat geen getallen aan strings toevoegen, je kunt alleen strings aan strings toevoegen. Had je zelf ook kunnen weten, als je strcat opzoekt in de documentatie dan zie je dat hij een const char * verwacht. Gebruik sprintf, daarmee kun je printf formatting doen naar een stukje geheugen ipv naar de console.

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.


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 26-04 20:53

Emiel1984

Made in NL

Topicstarter
.oisyn schreef op maandag 24 oktober 2005 @ 11:10:
Euh, waarom heeft iedereen het überhaupt over C#? Ik zie geen letter C# in de topic :?
.edit: @whoami: ah ok :)


[...]


Je kunt met strcat geen getallen aan strings toevoegen, je kunt alleen strings aan strings toevoegen. Had je zelf ook kunnen weten, als je strcat opzoekt in de documentatie dan zie je dat hij een const char * verwacht. Gebruik sprintf, daarmee kun je printf formatting doen naar een stukje geheugen ipv naar de console.
Ik dacht dat C# voor de taal C stond 8)7 , weet ik dat ook weer ;) .

sorry het is wat onduidelijk maar dat het strings moesten zijn wist ik. De getallen staan elk apart in een string.

Ik ga even kijken wat je met de sprintf bedoelt.


Edit:

Het is gelukt!! :) thks voor alle info. De functie sprintf werkte zoals ik al dacht het meest overzichtelijke dus die heb ik maar direct gebruikt en de andere achterwege gelaten.

code:
1
2
3
4
...
sprintf(acLink, "File%d%d.txt", iGetal1, iGetal2); //Kan ik toch nog integers gebruiken :D .
fopen=(acLink, "r");
..

[ Voor 24% gewijzigd door Emiel1984 op 24-10-2005 14:10 ]

[LTS][MTS][HTS]


  • unclero
  • Registratie: Juni 2001
  • Laatst online: 12:36

unclero

MB EQA ftw \o/

In linux kun je ook asprintf gebruiken..

C:
1
2
3
4
5
6
char *cpFileName;
asprintf(&cpFileName, "/home/bla/zut/file%d%d.txt", iNum1, iNum2);

/* ... dingetjes doen met file... */

delete [] cpFileName

Quelle chimère est-ce donc que l'homme? Quelle nouveauté, quel monstre, quel chaos, quel sujet de contradiction, quel prodige!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

unclero:
pointer should be passed to free(3) to release the allocated storage when it is no longer needed
Ik zou 'm dan maar ook niet met delete[] proberen te verwijderen, dat hoeft namelijk niet per se goed te gaan.

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.


Verwijderd

unclero schreef op dinsdag 25 oktober 2005 @ 13:03:
In linux kun je ook asprintf gebruiken..

C:
1
2
3
4
5
6
char *cpFileName;
asprintf(&cpFileName, "/home/bla/zut/file%d%d.txt", iNum1, iNum2);

/* ... dingetjes doen met file... */

delete [] cpFileName
Delete [] is C++, onder gewoon C wil je free(3) gebruiken. Dat is dus ook de valkuil achter asprintf, het reserveert zelf geheugen, als het niet lukt retourneert het -1 overigens, en wordt de &cpFileName op NULL gezet.
Pagina: 1