Toon posts:

[c++] char[] vullen uit een textbestand

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer een char[] te vullen met regels uit een tekstbestand. Het werkt wel als ik handmatig de waarden invoer:

C:
1
char *lijst[] = {"1. Incoming         ","2. Modification     ","3. Outgoing         ","4. Options          " };


maar als ik dit doe vanuit een tekstbestand gaat dit mis, helaas kan ik niet met string werken dus wil ik het graag met een char[] proberen

C:
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
int main()
{
    FILE *fread;
    char regel[200];
    char *list[20];
    int i, j;

    fread = fopen("data.txt", "r");
    i= 0;
    do
    {
        memset(regel, 0, 200);
        fgets(regel, 200, fread);
        printf("%s\n", regel);
        list[i] = regel;
        i++;
    }
    while(!feof(fread));

    fclose(fread);

    for (j = 0; j < i -1; j++)
    {
        printf("%d. %s\n", j+1, list[j]);
    }

    _getch();
    return 0;
}


tekstbestand is hier:
Incoming
Modification
Outgoing
Options

en uitvoer wordt
1.
2.
3.
4.
dus helemaal niets, iemand een idee, ik weet het gaat mis met die char[]

  • Larry4
  • Registratie: Augustus 2000
  • Niet online
elke pointer in list wijst naar dezelfde regel (je moet wel steeds een nieuwe regel aan maken? per regel van het text bestand

Verwijderd

Topicstarter
Dacht ik al, want gister had ik wel steeds de laatste regel of ik nu list[1] of list[5] deed. Maar hoe kan ik wel een list krijgen als onderstaande uit een tekstbestand?
C:
1
char *lijst[] = {"1. Incoming         ","2. Modification     ","3. Outgoing         ","4. Options          " };

  • Biedzjee
  • Registratie: December 2000
  • Laatst online: 14-08-2025
Je moet zorgen dat je in je lijst ruimte hebt om iedere afzonderlijke regel op te slaan. In jouw geval, is de ruimte in de lijst 20 karakters per regel.

Je moet dan in plaats van
C:
1
list[i] = regel; 

gebruiken
C:
1
strncpy(list[1], regel, 20)


Hiermee wordt de inhoud van de "actieve" regel gekopieerd in je lijst, met een maximum van 20 karakters.

[ Voor 10% gewijzigd door Biedzjee op 08-04-2003 08:30 ]

Trying to establish voice contact... please yell into keyboard.


Verwijderd

Topicstarter
Mijn programma knalt er hierbij uit, het is de bedoeling dat de uitvoer wordt gedisplayed en dat er dan met een escape kan worden gestopt. Maar volgens mij kom ik zo wel verder met die strncpy, maar gaat het mis met die lijst?

C:
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
int main()
{
    FILE *fread;

    char regel[200];
    char *list[20];
    int i, j;

    fread = fopen("data.txt", "r");
    i= 0;
    do
    {
        memset(regel, 0, 20);
        fgets(regel, 20, fread);
        strncpy(list[i++], regel, 20);
    }
    while(!feof(fread));
    fclose(fread);

    for (j = 0; j < i -1; j++)
    {
        printf("%d. %s\n", j+1, list[j]);
    }

                _getch();

    return 0;
}

[ Voor 7% gewijzigd door Verwijderd op 08-04-2003 08:56 ]


  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Natuurlijk gaat het mis ! Jij maakt een array van char*'s aan, maar je vraagt er nergens geheugen voor aan ;)

C:
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
30
31
32
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fread;

    char regel[200];
    char *list[20];
    int i, j;

    fread = fopen("data.txt", "r");
    i= 0;
    do
    {
        memset(regel, 0, 20);
        fgets(regel, 20, fread);
        list[i]=malloc(sizeof(char)*21);
        strncpy(list[i++], regel, 20);
    }
    while(!feof(fread));
    fclose(fread);

    for (j = 0; j < i -1; j++)
    {
        printf("%d. %s\n", j+1, list[j]);
    }

                getchar();

    return 0;
}

[ Voor 9% gewijzigd door XTerm op 08-04-2003 09:13 ]


Verwijderd

Topicstarter
op onderstaande manier vul je hem direct en hoef je er geen geheugen voor aan te vragen
char *lijst[] = {"1. Incoming ","2. Modification ","3. Outgoing ","4. Options " };

maar ik doe toch char *list[20], dan krijg ik toch een lijst waar maximaal 20 char's in geplaatst kunnen worden, en met strncpy reserveer ik toch de ruimte hierbinnen?

Aub hulp hiervoor, ik ben op dit gebied nogal new.

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Verwijderd schreef op 08 April 2003 @ 09:11:
op onderstaande manier vul je hem direct en hoef je er geen geheugen voor aan te vragen
char *lijst[] = {"1. Incoming ","2. Modification ","3. Outgoing ","4. Options " };

maar ik doe toch char *list[20], dan krijg ik toch een lijst waar maximaal 20 char's in geplaatst kunnen worden, en met strncpy reserveer ik toch de ruimte hierbinnen?

Aub hulp hiervoor, ik ben op dit gebied nogal new.
Nah ;)
C:
1
 char *list[20] 


Dit is een array (van 20 elementen) van char*'s die naar Death And Destruction pointen omdat ze uninitialised zijn.
Als je een pointer naar een array van 20 groot wil (dus een pointer naar array, type char **) heb je
C:
1
 char (*list)[20]  
nodig. De voorrang van de operatoren is hier belangrijk.

Verwijderd

Topicstarter
char **list[200];
..
strncpy((*list)[i], regel, 20);

meer op deze manier? Ik zoek me rot, heb een goed boek gekocht, maar hier kom ik toch echt niet uit.

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Verwijderd schreef op 08 april 2003 @ 09:19:
char **list[200];
..
strncpy((*list)[i], regel, 20);

meer op deze manier? Ik zoek me rot, heb een goed boek gekocht, maar hier kom ik toch echt niet uit.
Nou maak je een pointer naar een pointer naar een array :?

Kijk, van wat ik kan afleiden wil jij gewoon een array met strings.
We gaan ervanuit dat het aantal strings gekend is :
char *x[20]; Geeft je 20 char pointers.

Goed, die pointers wijzen naar niets, en mag je dus niet gebruiken.
Eerst moet je er geheugen aan toewijzen :

for(c=0;c<20;c++)x[c]=malloc(sizeof(char)*100);

Dat geeft je 20 strings van 99 karakters.
Pointers zijn enorm tricky, het duurt wel ff voor je dit soort dingen vlot kan ;)

Verwijderd

Topicstarter
Pointers duren inderdaad lang ja, ik ben weer vooraan in mijn hoofdstuk begonnen, maar kan de hulp enorm waarderen. Iets te lang met java gewerkt, daar gaat het net even wat makkelijker

Verwijderd

Hmm, in Java wordt elk object (array is in java ook een object) als pointer doorgegeven, dus wat dat betreft zou je het zo op moeten pakken. Je met alleen even opletten op memory leaks, that's all...

Verwijderd

Wat ben je nu mee bezig eigenlijk? Je doet het in c++? Dan kan je toch gewoon ifstream en ofstream gebruiken?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
char ** data=new char[AANTAL_ELEMENTEN];

ifstream bestand ("data.txt", ios::in);

for(char a=0; !bestand.eof(); a++){
char * bffr=new char[255];

bestand.read(bffr,'\n', 255);

data[a]=new char[strlen(bffr)];

strcpy(data[a], bffr);
}


Ik kan de code nu niet testen, zit nu op school. Vanmiddag zal ik er nog eens maar kijken.

Verwijderd

Topicstarter
He perfect Jeroen_Paul, deze method zocht ik, nou en je had hem bijna helemaal goed ook nog uit je hoofd!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jeroen_Paul: als je toch voorstelt om de iostreams te gebruiken, waarom zeg je er dan niet gelijk bij om std::string te gebruiken? Dat scheelt een hoop gezeur kwa memory management. En gebruik dan gelijk een std::list of std::vector om alle strings in op te slaan, dan heb je een mooie dynamische array

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fstream>
#include <string>
#include <list>

int main ()
{
    std::list<std::string> regels;
    std::string r;

    std::ifstream file ("data.txt");
    while (std::getline (r, file))
        regels.push_back (r);

    // al je regels staan nu mooi in 'regels'

    return 0;
}

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

Hij wilde string niet gebruiken, toch? Misschien wilt ie oefenen met chars, doe ik zelf ook altijd. Kan heel leuk zijn. Je kan natuurlijk ook gewoon strings gebruiken ja :)

offtopic vaagje: hoe maak je de code zo mooi?

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 08 april 2003 @ 23:35:
offtopic vaagje: hoe maak je de code zo mooi?
offtopic:
[ code=c++] gebruiken in plaats van [ code] (maar dan zonder de eerste spatie natuurlijk)

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
.oisyn schreef op 08 april 2003 @ 10:05:
Jeroen_Paul: als je toch voorstelt om de iostreams te gebruiken, waarom zeg je er dan niet gelijk bij om std::string te gebruiken? Dat scheelt een hoop gezeur kwa memory management. En gebruik dan gelijk een std::list of std::vector om alle strings in op te slaan, dan heb je een mooie dynamische array

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fstream>
#include <string>
#include <list>

int main ()
{
    std::list<std::string> regels;
    std::string r;

    std::ifstream file ("data.txt");
    while (std::getline (r, file))
        regels.push_back (r);

    // al je regels staan nu mooi in 'regels'

    return 0;
}
dit leek een leuke optie, helaas heb ik de beperkingen dat ik geen echte string kan gebruiken en geen namespace std, weer meer terug bij af

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

woeps, overheen gelezen
waarom kun je eigenlijk geen strings gebruiken?

en de std namespace is op zich geen probleem, dan is het gewoon een kwestie van de .h versies van de C++ headers includen

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

Topicstarter
ik werk met c++ versie 1.52 een hele oude, de toepassing waar ik voor schrijf heeft alleen lib's die daar mee kunnen werken

als ik gewoon een string probeer aan te maken lukt dit niet

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het heet trouwens Microsoft Visual C++ 1.52.
C++ is een taal op zich, en heeft geen versienummer (ja eigenlijk wel, maar niet zoals jij het bedoelt ;)). Het is dan ook niet zoals bijvoorbeeld Delphi, Visual Basic of PHP wat van 1 bepaalde maker is.

Er zijn dan ook talloze C en C++ compilers te vinden, met allemaal verschillende versienummers :)

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

Topicstarter
maar klopt het dan ook dat ik met mijn visual c++ 1.52 geen string kan gebruiken (string h, bijvoorbeeld)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
MSVC 1.52 heeft geen std::string, maar wel de MFC CString class. Die is niet zo goed, maar nog steeds heel veel beter dan char[]

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