Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[C++] String in 2en hakken

Sjoerd Boerhout
10 antwoorden
  • Ik heb een file waar in onderstaande format tekst in staat:
    [code:1:db9bda61e2]
    000hilde
    001ruben
    002maxime
    003jonas
    004scarlet
    005pieter
    006eva
    007gunnar[/code:1:db9bda61e2]

    Nu wil ik heel simpel elke regel in 2en hakken.
    Dus 1 variable met het nummer en 1 met de naam.
    De eerste 3 tekens naar variabel 1 en de rest naar 2.

    Dit is de Delphicode ervoor, maar die krijg ik niet omgezet naar C++.
    [code:1:db9bda61e2]Nr := StrToInt(Copy(StringList[I], 0, 3));
    Naam := Copy(StringList[I], 4, Length(StringList[I])); [/code:1:db9bda61e2]
  • Gebruik substr(). Daarmee kun je van een string een onderdeel (sub-
    string) nemen.
  • Zo zou het er (ongeveer) uit moeten komen zien:

    [code:1:34247cf2db]
    #include <stdlib.h>

    Nr = atoi(StringList[i].substr(0, 3));
    Naam = StringList[i].substr(3, (size(StringList[i])-3));
    [/code:1:34247cf2db]

    substr(i, j) pakt een substring vanaf plaats i met lengte j.
    atoi is blijkbaar het equivalent van StrToInt en vereist de
    library stdlib.h (vandaar de include).
  • Correctie:

    [code:1:dedc3fb530]
    #include <stdlib.h>

    Nr = atoi(StringList[i].substr(0, 3));
    Naam = StringList[i].substr(3, (StringList[i].size() - 3));
    [/code:1:dedc3fb530]

    (Het is natuurlijk nog altijd object-georienteerd :D)
  • Het werkt nog steeds niet helemaal.
    Ik heb nu dit:

    header:
    [code:1:6b9e3519d4]
    private: // User declarations
    TStringList * SListGroepen;
    [/code:1:6b9e3519d4]

    Code:
    [code:1:6b9e3519d4]
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String sNaam;
    int iCijfer;

    SListGroepen = new TStringList();
    SListGroepen->LoadFromFile("g4a.dat");

    for(int i = 0; i < (SListGroepen->Count - 1); i++)
    {
    [b]iCijfer = atoi(SListGroepen.substr(0, 3));
    sNaam = SListGroepen.substr(3, (SListGroepen.size() - 3)); [/b]


    ListBox1->Items->Add(sCijfer);
    ListBox2->Items->Add(sNaam);
    }
    SListGroepen->Clear();
    }[/code:1:6b9e3519d4]

    Op die 2 dikgedrukte regels code krijg ik de volgende errors:
    [quote:6b9e3519d4]
    [C++ Error] Unit1.cpp(29): E2294 Structure required on left side of . or .*
    [C++ Error] Unit1.cpp(30): E2294 Structure required on left side of . or .*
    [C++ Error] Unit1.cpp(30): E2268 Call to undefined function 'size'
    [/quote:6b9e3519d4]

    Ik heb de . al vervangen door -> maar dan werkt het ook niet.

    EDIT:
    Met [b:6b9e3519d4]SListGroepen->Strings;[/b:6b9e3519d4] pak ik de hele regel. Die moet dan dus in 2en.
  • Nu ben ik niet zo thuis in het gebruik van ->, maar het lijkt me wel
    beter om het consequent te gebruiken. Verander de punten toch maar
    in -> en voeg achter subst(0, 3) hetvolgende: ->c_str()
  • Hij werkt!
    Op 1 dingetje na. Hij rond 000 af naar 0, 001 naar 1 enz.
    Ook al ik een double gebruik ipv int, maar daar kom ik wel uit.
    Bedankt voor de hulp.

    [code:1:a51e1f3b99]String sNaam;
    int iCijfer;

    SListGroepen = new TStringList();
    SListGroepen->LoadFromFile("g4a.dat");

    for(int i = 0; i < (SListGroepen->Count); i++)
    {
    iCijfer = StrToFloat(SListGroepen->Strings[i].SubString(1, 3));
    sNaam = SListGroepen->Strings[i].SubString(4,(SListGroepen->Strings[i].Length() - 3));

    ListBox1->Items->Add(iCijfer);
    ListBox2->Items->Add(sNaam);
    }
    SListGroepen->Clear();[/code:1:a51e1f3b99]

    EDIT: Als ik het cijfer ook als String doe werkt alles ok, dus dan doe ik het zo.
  • Aaaargh, ik moet m'n kennis van C++ maar eens opfrissen, want
    volgens mij gebruik ik een beetje antieke constructies.
    Er zijn ook tig manieren om iets in C++ voor mekaar te spelen en
    als je die dingen gaat combineren, levert dat aardig wat hoofdpijn
    op :)
    Maar goed, jij hebt het werkend. Ik had ook iets werkends in elkaar
    geflanst, maar op een totaal andere manier.

    Wat is trouwens het probleem met het feit dat 001 wordt "afgerond"
    naar 1? Dat is toch de bedoeling? Je wilt immers een getal terugkrijgen
    en 001 is in mijn ogen geen getal.
  • Het is een opdracht voor school.
    We moeten een programma herschrijven met een aantal extra functies.
    Dit programma kan van leerlingen de uitslagen van toetsen bijhouden.
    Het huidige is vrij bagger, maar de nieuwe moet met de oude files kunnen werken…


    In een file staat bv:
    [quote:f678a2c199]000hilde
    001ruben
    002maxime
    003jonas
    004scarlet
    005pieter
    006eva
    007gunnar[/quote:f678a2c199]

    De cijfers zijn het ID van de leerling. De resultaten worden met dit ID opgeslagen en niet met de naam. Dus het ID moet wel die 3 cijfers blijven.

    Alles in een database zetten is makkelijker, maar dat mag dus niet… :cry:
  • Ok, duidelijk. Wat voor soort C++ gebruik je trouwens?
    Visual C++ .NET ofzo? Die SubString constructie kende
    ik namelijk nog niet.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.