2016-04-05 7 views
2

Ich bin neu in der Programmierung in C, etwas Arbeit an einem MIDI-Aufnahmeprogramm, das die Noten abspielt, und kann nicht scheinen, das Programm aus der Datei in meine Struktur zu lesen Array.Lesen von Datei in Struktur in C

Hier ist die Struktur:

typedef struct 
{ 
    int noteNumber; 
    int vel; 
    int oscillatorNumber; 
    float freq; 
} oneNote; 

Und hier ist der Code, um die Noten in lesen: Bei der Lagerung ist

filePointer = fopen("noteRecordFile.txt", "r"); 

if (filePointer == NULL) 
{ 
    printf("Error opening file\n"); 
} 
else 
{ 
    printf("File opened\n"); 

    fseek(filePointer, 0L, SEEK_END); 
    fileSize = ftell(filePointer); 
} 

einfach nicht:

oneNote notes[2000]; 

for (count = 0; count < fileSize; count++) 
{ 
    fscanf(filePointer, "%d %d %d\n", &notes[count].noteNumber, 
             &notes[count].vel, 
             &notes[count].oscillatorNumber); 

    notes[count].freq = ntof(notes[count].noteNumber); 
} 

-Code, wo Datei geöffnet wird die und der Daten in der Struktur, wie hier zu sehen ist:

Image of debug console

ersten Zeilen noteRecordFile.txt:

48 108 0 
50 108 0 
52 100 0 
+2

Bitte geben Sie den Teil des Codes, wo Sie die Datei zu öffnen – Aeldred

+0

Ich habe jetzt getan, wenn ich das Programm ausführen, sagt die Datei geöffnet ist –

+0

Bitte geben Sie die ersten Zeilen der Datei 'noteRecordFile.txt'. –

Antwort

2

Es gibt mehrere Probleme:

Entfernen Sie die folgenden 2 Zeilen, weil es den Dateizeiger an das Ende der Datei setzt und wir das Lesen am Anfang der Datei und ftell w starten möchten Ich gebe Ihnen die Anzahl der Bytes in der Datei und nicht die Anzahl der Zeilen.

fseek(filePointer, 0L, SEEK_END); 
fileSize = ftell(filePointer); 

Dann müssen Sie dies:

FILE *filePointer = fopen("noteRecordFile.txt", "r"); 

    if (filePointer == NULL) 
    { 
     printf("Error opening file\n"); 
     exit(1); // <<< abort program if file could not be opened 
    } 
    else 
    { 
     printf("File opened\n"); 
    } 

    int count = 0; 
    do 
    { 
     fscanf(filePointer, "%d %d %d", &notes[count].noteNumber, 
             &notes[count].vel, 
             &notes[count].oscillatorNumber); 

     notes[count].freq = ntof(notes[count].noteNumber); 
     count++; 
    } 
    while (!feof(filePointer)); // <<< read until end of file is reached 
    ... 

Wir können nicht die Anzahl der Zeilen wissen die Datei enthält, ohne die gesamte Datei zu lesen, so verwenden wir einen anderen Ansatz: wir bis zum Ende des gerade gelesen Datei ist erreicht.

Sie müssen noch eine Überprüfung hinzufügen, denn wenn die Datei mehr als 2000 Zeilen enthält, werden Sie in Schwierigkeiten geraten. Dies ist eine Übung für den Leser.

0

Sind Sie über Ihr Dateiformat sicher? Wie ich sehe, lesen Sie die Überschrift auch als eine normale Datenzeile ...

Versuchen Sie, dies zu lesen, vielleicht wird es Ihnen helfen.

MIDI

Sie können versuchen, die Datei als binäre openning, ich erinnere mich, es ein Problem behoben i ... auf einigen Tondateien hatte!

Haben Sie Fehler/Warnungen während der Kompilierung und Ausführung?

+0

Das Dateiformat war in Ordnung, sjsam hatte die Antwort, aber danke –

2

Es wird nicht, weil Sie das Ende der Datei auf der Linie erreicht:

fseek(filePointer, 0L, SEEK_END); 

benötigen Sie den Dateizeiger auf den Anfang der Datei zurück:

fseek(filePointer, 0L, SEEK_SET) 
+0

Danke, das stellte sich als das Problem –

+0

@HarryJordan: das ist nur ein Problem. Lies meine Antwort. –