Un bon nombre de problèmes ici.
Le premier paramètre passé à cabclh
est du mauvais type:
void cabclh(ALUNO alunos[],int a);
: :
int aluno;
cabclh(aluno,b);
Vous devriez probablement quitter la fonction (ou une autre gestion des erreurs) si vous ne pouvez pas ouvrir le fichier:
if (fp==NULL){
printf("Erro ao abrir o ficheiro\n");
return; // <- Added
}
Inutile d'ouvrir le fichier une centaine de fois. Si un fichier normal ne s'ouvre pas la première fois, il ne s'ouvrira probablement pas du tout (bien que cela puisse arriver dans certains cas). Ce segment particulier se traduira par des descripteurs de fichiers gaspillés:
for(i=0;i<100;i++){
fp=fopen("trabalho.txt","r");
}
En outre, il réinitialise le pointeur de fichier au début du fichier à chaque fois.
Si votre intention est de lire jusqu'à 100 articles de ce fichier pour le stockage dans votre tableau, je vous suggère de commencer par:
#include <stdio.h>
#include <stdlib.h>
typedef struct aluno{
char cabecalho[60];
char info[100];
int n_alunos;
char dados[100];
char curso[100];
int numero;
char nome[100];
char e_mail[100];
int n_disciplinas;
int nota;
} ALUNO;
void cabclh (ALUNO alunos[]) {
FILE *fp;
int i;
// Initialise all elements to indicate no data.
for (i = 0; i < 100; i++)
alunos[i].cabecalho[0] = '\0';
// Open the file, returning if not there.
fp = fopen ("trabalho.txt","r");
if (fp == NULL) {
printf("Erro ao abrir o ficheiro\n");
return;
}
// Only allow up to 100 elements.
for (i = 0; i < 100; i++) {
// Only read and load if more to go.
if (!feof(fp)) {
// Read the line and strip off newline character.
fgets (alunos[i].cabecalho,60,fp);
if (alunos[i].cabecalho[strlen(alunos[i].cabecalho)-1] == '\n')
alunos[i].cabecalho[strlen(alunos[i].cabecalho)-1] = '\0';
printf ("%s\n", alunos[i].cabecalho);
}
}
// Close the file.
fclose (fp);
}
int main (int argc, char *argv[]) {
ALUNO alunos[100];
cabclh(alunos);
system("PAUSE");
return 0;
}
Il lit avec succès un fichier de test que j'ai créé. Maintenant, il se peut que votre fichier d'entrée soit plus compliqué que 100 chaînes à charger dans cabecelho
mais le code ci-dessus est un bon début, montrant la logique de contrôle. Le format de la ligne d'annonce différente ne changerait que la façon dont chaque ligne est lue, pas la boucle qui l'entoure. Et, si vous voulez être capable de gérer un nombre arbitraire de lignes, je passerais de tableaux à des structures de données plus extensibles. Mais, pour une première tentative, vous faites le bon choix en le gardant simple.
Comment savez-vous que quelque chose ne va pas? Le compilateur a-t-il donné une erreur? Aussi, est-ce que c'est des devoirs? – Javier
S'il vous plaît expliquer votre problème avant l'extrait de code, vous avez peu de chances d'obtenir une réponse à la façon dont vous avez présenté cette question, surtout avec seulement 1 point de rep. C'est aussi dans une langue différente. –
Pedro, en fixant votre indentation je pense qu'il y a un problème évident, on ne sait pas si c'est une faute de frappe ou un problème légitime parce que vous ne fournissez pas d'explication adéquate de ce que le comportement attendu et observé est –