Nur bestimmte Zeilen aus einer CSV einlesen - [C]

Juhuuu neues Problem..Also ich bin schon fast fertig mit dem ganzen Programm und beim Testen is mir was aufgefallen:

Wenn ich in meiner CSV, die vorher so aussah:
Code:
bisher vollendete Runde;1

Name der Mannschaften;Ergebnis Runde 1                    

 MA 1 vs MA 2;8;1
 MA 1 vs MA 3;8;5
 MA 1 vs MA 4;8;5
 MA 2 vs MA 3;8;5
 MA 2 vs MA 4;8;5
............

nun das "vs" in "gegen" tausche:
Code:
bisher vollendete Runde;1

Name der Mannschaften;Ergebnis Runde 1                    

 MA 1 gegen MA 2;8;1
 MA 1 vs MA 3;8;5
 MA 1 vs MA 4;8;5
 MA 2 vs MA 3;8;5
 MA 2 vs MA 4;8;5

kackt das Programm ab.

Die Länge von der geänderten Zeile dürfte somit von vorher 17 Chars/136Bytes auf 20 Chars/160Bytes gestiegen sein.
Die Variablen müssten doch eigentlich groß genug sein (s.u.)?!

Und was ich noch festgestellt habe: Wenn die geänderte Zeile maximal 19Zeichen lang ist, dann stürzt das Programm nicht ab, die nachfolgenden Zeilen sind bei der Ausgabe jedoch sozusagen alle "verschoben"; wahrscheinlich um den Wert, um den die Anzahl der Zeichen von der geänderten Zeile gewachsen ist:
Unbenannt2.jpg


Das sollte ja eigentlich Indiz genug sein meint man, aber ich finde nichts :(


hier nochmal der Code dazu:

Code:
char speicher[1024];
char einteilung_r1[24][256];
int arrayergebnisse_r1[24][2]={0};

..........


if(runde==1){

    //überspringt die ersten 3 Zeilen
    for(i=0;i<3;i++){
        fgets(speicher,1024,turnierliste);
        }

    //liest ab der 4. Zeile die nächsten 24 ein
        for(i=0;i<24;i++){                           //speichert jede Zeile einmal in einem String
        fgets(speicher,1024,turnierliste);

            while(speicher[k]!=';'){                //wenn ";" im string gefunden wird (d.h. nach Mannschaftsname), wird der string mit "\0" abgeschlossen
                k++;
            }
            speicher[k]='\0';
            strcpy (einteilung_r1[i],speicher);         //eingelesene Mannschaftseinteilung wird in array einteilung für runde 1 kopiert

              sscanf(&speicher[k+1],"%d;%d",&arrayergebnisse_r1[i][0],&arrayergebnisse_r1[i][1]);

        }
 
Nein, innerhalb der Funktion am Anfang halt. k wird aber in dem Code, den ich gepostet habe, zum ersten Mal benutzt, d.h. er könnte vorher ja gar nicht verändert worden sein.
Aber k=0 setzen direkt vor der while-schleife, hat am Ergebnise auch leider nichts geändert.
Irgendwie muss irgendwas ja limitiert sein, so dass das Programm dann bei 20Zeichen einer Zeile abschmiert...?!

Grüße
 
Kannst du einmal über einen Debugger prüfen, in welcher Zeile der Absturz ist und welche Werte i und k dabei haben?
Oder einmal den Komplettquelltext reinstellen (eventuell als Zip als Anhang, wenns sonst zu lang wird), dann mach ich das schnell.
 
Hi

welchen Compiler verwendest du denn, der das protestlos nimmt?

Wenn du schon jeder Funktion den Rückgabetyp int gibst, sollte auch ein return drin sein.
Aber eigentlich hast du keine Funktion, bei der du einen Rückgabewert brauchst; warum also nimmst du dann nicht void statt int?

Und Vorwärtsdeklarationen wären auch schön.
Wenn du eine Funktion aufrufst, die im Quelltext erst irgendwo danach steht, sollte vorher (am besten gleich am Dateianfang) nocheinmal Returntyp, Name und Parameter der Funktion stehen, aber statt dem gesamten "Inhalt" nur einen Strichpunkt.
zB so:
C++:
int teilnehmer_erstellen(void);
int teilnehmerliste_laden(void);
int hauptmenue(void);
int loeschen_aendern(void);
...

Zum eigentlichen Problem: Wenn ich "k=0;" vor der while-Schleife schreibe, funktioniert bei mir alles, auch mit verlängerten Zeilen in der Datei. Nocheinmal die Frage, welchen Compiler du verwendest?

Ergänzung: Dein Debugger hat richtig gezeigt, das die while-Schleife das Problem war. Sollte sich mit dem "k=0" eigentlich erledigen...

Gruß
 
Zuletzt bearbeitet:
Oha! Es funktioniert! :D
Ein ganz großes Danke :)
Ich verwende Code Blocks als Entwicklungsumgebung, der Compiler ist der GNU GCC Compiler.
Und danke nochma für die Tipps, habe das mit den int wahrscheinlich aus Gewohnheit gemacht, weil man das so am Anfang des Studiums auch gelernt hat.

Grüße!
 
Wundert mich, dass der GCC sich da nicht beschwert...

Aber gut, dass es jetzt funktioniert :)

Gruß

PS: Markier das Thema bitte noch als Erledigt, mit einem Klick auf den blau-weißen Haken neben "Auf Thema Antworten".
 
Zurück