Text aus Datei auswerten && Wii Timingproblem

Also ich habs so gemacht:

Code:
fscanf(txt, ": %d %d %d %s", &z1, &z2, &z3, wort);
printf("Start: %d\nLaenge: %d\nTonhoehe: %d\nText: %s\n\n", z1, z2, z3, wort);

fscanf(txt, ": %d %d %d %s", &z1, &z2, &z3, wort);
printf("Start: %d\nLaenge: %d\nTonhoehe: %d\nText: %s", z1, z2, z3, wort);

und es kommt beide Male zur gleichen ausgabe...
 
Ersten Zeilen der Datei sehen so aus:

: 0 3 14 John
: 8 3 11 Peter
: 16 2 14 Hanz
: 20 2 14 Bernd
: 24 3 11 Fritz

-------EDIT-------
Habs jetzt hinbekommen: Windows macht am Ende immer "/r/n" - wenn ich das ans Ende von fscanf schreibe gehts :) Dankeschön nochmal!
 
Zuletzt bearbeitet:
Grad selbst getestet, bei mir funktionierts, wenn ich wie schon gesagt
\n im fscanf reinnehme.

Das hast du also probiert, und hat nicht funktioniert?
Betriebssystem?
 
Also es geht jetzt wie oben gesagt thx :)

Eine Sache hätte ich aber noch wenn in der Datei steht:

: 20 2 14 Bernd (zwischen 14 und Bernd sind 2 Leerzeichen)

soll er nur das erste Leerzeichen als Trennung ansehen und das zweite mit in den String nehmen. Wäre halt das was du am Anfang gefragt hast ob auch Leerzeichen drin vorkommen - sry nicht dran gedacht. Ist das sehr viel anders?
 
Ist garantiert min. ein Leerzeichen drin oder kann als Trennzeichen
auch mal ein einzelner Tabulator dabei sein?
 
Vorausgesetzt, keine Zeile ist länger als 100 Zeichen
und die wort-Variable ist groß genug für die Wörter
C++:
int zeile_einlesen(FILE *dat, int *z1, int *z2, int *z3, char *wort)
{
    char zeile[100];
    int i;

    if(!fgets(zeile, 100, dat))
        return 1;

    i = strlen(zeile) - 1;
    while(i >= 0)
    {
        if(zeile[i] == 10 || zeile[i] == 13 || zeile[i] == ' ')
            zeile[i--] = '\0';
        else break;
    }
    while(i >= 0)
    {
        if(zeile[i] != 32)
            --i;
        else break;
    }
    while(i >= 0)
    {
        if(zeile[i] == 32)
            --i;
        else break;
    }
    if(i < 1)
        return 2;
    zeile[++i] = '\0';
    strcpy(wort, &zeile[++i]);
    if(3 != sscanf(zeile, ": %d %d %d", z1, z2, z3))
        return 3;
    return 0;
}
Ungetestet
Aufruf:
C++:
if(zeile_einlesen(txt, &z1, &z2, &z3, wort))
{
    //Fehler
}

Gruß
 
Ich wer mal noch ein bisschen genauer - stehe nämlich gerade noch vor einem anderen Problem auch wenns jetzt etwas vom Thema abweicht.

Die Textdatei ist nämliche eine Lyrics Dateivon dem Programm Ultrastar (Karaoke für den PC). Ich bin gerade dabei das ganze für die Wii umzusetzten. Der aufbau dabei ist:

0 - beginn des Textes
3 - Notenlänge
14 - Tonhöhe
Notentext

Hier nochmal ein Auschnit aus der Textdatei:

Code:
: 0 3 14 Sun
: 8 3 11  down,
: 16 2 14  fri
: 20 2 14 day
: 24 3 11  night,

Die Zahlen sind die Beats an denen die Note startet - jedes Lied hat also eine BPM (Beats per Minute) und eine GAP (weiß nicht genau was das ist). Die Beats berechnen sich so. Nehmen wir mal an BPM = 90 und GAP = 15000

start / (90 * 4) * 60 + Gap /1000 = Zeit nach der die Note startet
0 / (90 * 4) * 60 + 15000 /1000 = 15 Sekunden

Jetzt möchte ich so lange warten bis die Note startet, den Notentext ausgeben und dann die Länge der Note warten. Habe das so versucht:

Code:
unsigned long start, laenge, hoehe;
unsigned long ende, vorbei = 0;

fscanf(txt, ": %ld %ld %ld %s\n", &start, &laenge, &hoehe, text);
		
start = start / (250 * 4) * 60 + (15650 / 1000); // BPM = 250 GAP = 15650
ende = (start + laenge) / (250 * 4) * 60 + (15650 / 1000); // BPM = 250 GAP = 15650

usleep((start - vorbei) * 1000000);
printf("%s", text);
usleep((ende - start) * 1000000);

vorbei = ende;

Habe den Code etwas vereinfacht - die Dauerschleife ist raus und die Wii Befehle habe ich auch rausgenommen.

Allerdings wird so der Text viel schneller angezeigt als er sollte. Innerhalb von ca 10 Sekunden ist die komplette txt Datei durchgelaufen. Das ist ja nicht sinn der Sache. Eigentlich sollte ja so der Text passend zum Lied ausgegeben werden (Voraussetzung dafür ist natürlich das die txt Datei richtig ist - das ist hier aber 100%ig der Fall).

Noch ne Idee warum das ganze so schnell durchläuft? Ich sehe darin gerade keinen Fehler...
 
Zuletzt bearbeitet:
Hab nicht wirklich verstanden, was los ist...
bitte vereinfache den Code nicht.

Pro Zeile: Notenlänge und Tonhöhe versteh ich ja, aber warum ist 0 der "Textbeginn"?

Gap wird wohl "Lücke" oder so sein.
 
Zurück