Je doet trouwens nog wat foute dingen. Je doet al
n+=1 (overigens is
n++ m.i. bondiger en duidelijker) voor de eerste keer dat je regel[n] gebruikt. Dus regel[0] bevat op het eind nog ongeïnitialiseerd geheugen (lees: random crap
) en de laatste regel[n] die je vult valt buiten je buffer (je overschrijft dan een random deel ergens in het geheugen).
Daarnaast nog wat dingen die niet strikt onjuist zijn, maar wel veel handiger zijn om het anders te doen:
- Hoe kom je aan aantal_regels, of hoe wordt dat gedefinieerd? Ik zou zeggen: je gaat bijvoorbeeld eerst het hele bestand een keer langs (voor iedere regel een
fgets(dummy)) en telt zodoende het aantal_regels (en daarna een rewind om echt te gaan lezen). Maar aantal_regels is bij jou zo te zien geen variabele, anders kun je geen dingen als
int id[aantal_regels] enzo doen...? (dat kan namelijk alleen met constantes)
- In plaats van tien keer
((aantal_regels/3)+1) te gebruiken, eenmalig een
aantal_zinnige_regels ofzo definiëren
- Die str0, str4 en str7 hoef je waarschijnlijk niet voor alle (zinnige) regels te bewaren. Je bewaart immers ook al de complete regels, en de geconverteerde waarden (id, type1, en type2).
- In plaats van die str0, str4 en str7 en dan atoi() kun je met sscanf ook rechtstreeks naar integers lezen. Zet op die plaatsen
%d in plaats van
%s in de format string, en geef pointers naar ints mee in plaats van pointers naar char pointers.
- Je alloceert nu voor alle (zinnige) regels het maximale aantal karakters (100), terwijl de meeste regels waarschijnlijk niet zo lang zijn. Nou is dat voor 300.000 regels van ieder max 100 bytes geen probleem, maar beter zou zijn om van te voren te bepalen hoe groot die data van alle zinnige regels in totaal is (dat kan bijvoorbeeld in die eerste stap waar je aantal_regels bepaalt), dan één buffer alloceren, en de regel pointers naar de juiste plekken in die ene grote buffer laten pointen.
- Grote buffers (of buffers waarvan je van te voren niet weet of en hoe groot ze zijn) moet je met
malloc of
new alloceren.
In theory, there's no difference between theory and practice. In practice, there is.