Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C] Dynamisch structarray naar .txt kopiëren

Pagina: 1
Acties:

  • Michielodc
  • Registratie: September 2011
  • Laatst online: 08-11 14:03
Beste Tweakers,

Op het moment loop ik vast met een opdracht. Hierbij maak ik een woordenboek, een engels woord met de vertaling erbij. Ik lees een .txt bestand uit en plaats dit in een Dynamisch Array. Ik kan dan een woord toevoegen, verwijderen(werkt nog niet), uitprinten en exit.

Als ik exit doe, dan wordt het Dynamische Array terug in het .txt bestand gezet met de nieuwe woorden.

Op het begin heb ik dan bijvoorbeeld:

book boek
keyboard toetsenbord
mouse muis

Met een erbij wordt het dan

book boek
keyboard toetsenbord
mouse muis
table tafel

Het wordt alleen

book boek
keyboard toetsenbord
mouse muistable tafel

Het werkte eerst, maar toen ik bezig was met het verwijderen stopte het met werken. Ik kom er nu niet meer uit en heb veel gezocht. Hierbij wat code:

aantalZinnen is een variabel die bijhoudt hoeveel woorden met vertaling er zijn.
adres = een pointer.

struct
C:
1
2
3
4
5
struct relatie
{
    char    woord[30];
    char    vertaling[30];
};


inlezen
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for(i = 0; i < 60; i++)
        regel[i] = '\0';

    FILE *fp;
    fp = fopen("file.txt", "r");

    while(fgets(regel, sizeof regel, fp) != NULL)
    {
        aantalZinnen++;
        woorden = (relatie *)realloc(adres, aantalZinnen * sizeof(relatie));
        adres   = woorden;

        strcpy(woorden[aantalZinnen - 1].woord, strtok(regel, " "));
        strcpy(woorden[aantalZinnen - 1].vertaling, strtok(NULL, " "));

        for(i = 0; i < 60; i++)
            regel[i] = '\0';
    }
    fclose(fp);


De while waar het toevoegen waarschijnlijk fout gaat:

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
while(keuze != 5)
    {
        if(keuze == 1)
        {
            aantalZinnen++;
            woorden = (relatie *)realloc(adres, aantalZinnen * sizeof(relatie));
            adres   = woorden;

            printf("\nVoer woord in: ");
            scanf("%s", woorden[aantalZinnen - 1].woord);
            printf("\nVoer vertaling in: ");
            scanf("%s", woorden[aantalZinnen - 1].vertaling);
        }
        else if(keuze == 2)
        {
            for(i = 0; i < aantalZinnen; i++)
                printf("Woord: %s\t\tVertaling: %s", woorden[i].woord, woorden[i].vertaling);
        }
        /*else if(keuze == 3)
        {   
        }*/
        printf("\nMaak nieuwe keuze: ");
        scanf("%i", &keuze);
    }


Het terugschrijven naar het .txt bestand:
C:
1
2
3
4
5
fp = fopen("file.txt", "w");
    for(i = 0; i < aantalZinnen; i++)
        fprintf(fp, "%s %s", woorden[i].woord, woorden[i].vertaling);

    fclose(fp);


De code ziet bij het toevoegen dus wel dat er een nieuw woord is met vertaling. Maar zet dit niet op een nieuwe regel.

Hopelijk heeft iemand een idee! :)

Alvast bedankt!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:59

Matis

Rubber Rocket

Dat komt omdat je geen line-feed toevoegt bij het schrijven naar een bestand.
C:
1
2
3
4
/* Linux */
fprintf(fp, "%s %s \n", woorden[i].woord, woorden[i].vertaling); 
/* Windows */
fprintf(fp, "%s %s \r\n", woorden[i].woord, woorden[i].vertaling); 

:)

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


  • Michielodc
  • Registratie: September 2011
  • Laatst online: 08-11 14:03
Als ik het dan terug schrijf ziet het .txt bestand er zo uit:

C:
1
2
3
4
5
6
book boek

keyboard toetsenbord

mouse muis
book boek


Als ik het print om te testen staat er dan nog steeds:

Woord: book Vertaling: boek
Woord: keyboard Vertaling: toetsenbord
Woord: mouse Vertaling:muisWoord:table Vertaling: tafel

  • Cartman!
  • Registratie: April 2000
  • Niet online
Misschien zitten er ook newlines in je strings al, die moet je dan eerst sanatizen.

  • Michielodc
  • Registratie: September 2011
  • Laatst online: 08-11 14:03
Cartman! schreef op maandag 03 oktober 2011 @ 10:43:
Misschien zitten er ook newlines in je strings al, die moet je dan eerst sanatizen.
Ik heb geprobeerd bij nieuwe woorden een newline toe te voegen bij het printen. Het bleef dan nog op dezelfde lijn staan. Hoe kan ik eigenlijk zoeken of er een newline bij zit?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Denk eens even logisch na; je leest een bestand waar de woorden goed in staan (en dus newlines). Vervolgens schrijf je nieuwe woorden weg zonder newlines => die komen er achter staan.
Nu schrijf je achter alle gelezen strings newlines weg en staan er opeens "dubbele newlines" in je bestand. Ergo: je leest de strings, bewaart ze inclusief newlines en vervolgens schrijf je de strings met newlines met nog eens nieuwe newlines weg. Ra ra politiepet, wat zou er loos zijn?

Misschien dat 't voor jezelf helderder wordt als je er eens een hex-editor oid bij neemt zodat je alle bytes kunt "zien" die je wegschrijft. Ook een beetje basic debugwerk moet hier prima uitkomst bieden (Debuggen: Hoe doe ik dat?). Lees je ook even in in het hele newline gebeuren en ga even na wat je editor van keuze precies doet met deze verschillen; de één zal namelijk een \r\n pas 'accepteren' als newline, de ander heeft aan een \n al genoeg.

[ Voor 47% gewijzigd door RobIII op 03-10-2011 11:22 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Michielodc
  • Registratie: September 2011
  • Laatst online: 08-11 14:03
RobIII schreef op maandag 03 oktober 2011 @ 11:17:
Denk eens even logisch na; je leest een bestand waar de woorden goed in staan (en dus newlines). Vervolgens schrijf je nieuwe woorden weg zonder newlines => die komen er achter staan.
Nu schrijf je achter alle gelezen strings newlines weg en staan er opeens "dubbele newlines" in je bestand. Ergo: je leest de strings, bewaart ze inclusief newlines en vervolgens schrijf je de strings met newlines met nog eens nieuwe newlines weg. Ra ra politiepet, wat zou er loos zijn?
Dat is inderdaad waar. Maar ik had dus iets gelezen van gets bij C++, maar daarbij onthoudt hij de \n niet in de string en bij C wel. Dom van mij om alleen maar even snel te kijken en aan te nemen dat het wel hetzelfde zal zijn als bij C.

Iedereen bedankt voor de hulp. Nu kan ik weer even verder :)

  • Michielodc
  • Registratie: September 2011
  • Laatst online: 08-11 14:03
Nog een kleine update:

Het werkt nu! Ik heb nu een loop die van de newline een '\0' maakt. Nu zet ik er zelf dan een \n voor. Zodat het niet meer dubbel is.

Thx!
Pagina: 1