2016-04-05 2 views
2

Je ne connais pas encore la programmation en C, je travaille sur un programme d'enregistrement MIDI qui lit les notes et n'arrive pas à lire le programme dans le fichier. tableau.Lecture d'un fichier dans Structure en C

est ici la structure:

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

Et voici le code pour lire les notes:

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 où fichier est ouvert:

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); 
} 

juste ne stocke pas le et des données dans la structure, comme peut être vu ici:

Image of debug console

premières lignes de noteRecordFile.txt:

48 108 0 
50 108 0 
52 100 0 
+2

S'il vous plaît fournir la partie de code où vous ouvrez le fichier aussi – Aeldred

+0

J'ai fait maintenant, quand je cours le programme, il dit que le fichier est ouvert –

+0

S'il vous plaît fournir les premières lignes du fichier 'noteRecordFile.txt'. –

Répondre

2

Il y a plusieurs problèmes:

Supprimer les 2 lignes suivantes, car il met le pointeur de fichier à la fin du fichier et nous voulons commencer la lecture au début du fichier, et ftell w Mal vous donner le nombre d'octets dans le fichier et non le nombre de lignes.

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

Ensuite, vous devez ceci:

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 
    ... 

Nous ne pouvons pas connaître le nombre de lignes contient le fichier sans lire le fichier entier, nous utilisons donc une approche différente: nous venons de lire jusqu'à la fin de la le fichier est atteint.

Vous devez toujours ajouter une vérification, car si le fichier contient plus de 2 000 lignes, vous rencontrerez des problèmes. Ceci est laissé comme un exercice pour le lecteur.

0

Êtes-vous sûr de votre format de fichier? Comme je vois, vous lisez l'en-tête aussi comme une ligne de données normale ...

Essayez de lire ceci, peut-être qu'il va vous aider.

MIDI

Vous pouvez openning le fichier sous forme binaire, je me souviens qu'il fixe un problème que j'avais sur certains fichiers son ...!

Avez-vous des erreurs/avertissements lors de la compilation et de l'exécution?

+0

Le format de fichier était bien, sjsam avait la réponse, mais merci –

2

Il ne sera pas parce que vous avez atteint la fin du fichier sur la ligne:

fseek(filePointer, 0L, SEEK_END); 

vous devez réinitialiser le pointeur de fichier au début du fichier:

fseek(filePointer, 0L, SEEK_SET) 
+0

Merci, cela s'est avéré être le problème –

+0

@HarryJordan: c'est juste un problème _one_. Lisez ma réponse –