2010-04-21 3 views
-1
#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[],int a){ 
    FILE *fp; 
    int i; 
    for(i=0;i<100;i++){ 
     fp=fopen("trabalho.txt","r"); 

     if(fp==NULL){ 
      printf("Erro ao abrir o ficheiro\n"); 
     } 
     while(!feof(fp)){ 
      fgets(alunos[i].cabecalho,60,fp); 
      printf("%s\n",alunos[i].cabecalho); 
     } 
    } 
    fclose(fp); 
} 

Qu'est-ce qui ne va pas ici?C programmation fopen

principale:

int main(int argc, char *argv[]){  
    ALUNO alunos[100]; 
    int aluno; 
    int b; 

    cabclh(aluno,b); 

    system("PAUSE"); 
    return 0 
+0

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

+1

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

+0

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 –

Répondre

1

On dirait que vous ouvrez le fichier 100 fois, puis en utilisant une boucle while avec [i] qui n'a jamais changer. i = 100 car il n'a jamais changé à l'intérieur de votre boucle while.

+0

Il semble aussi y avoir un extra fermeture de fermeture. – Javier

+0

Cela semble être plus d'un problème de retrait, les gars. Le tout est à l'intérieur de la déclaration pour, y compris, faussement, le fopen. – paxdiablo

+0

@paxdiablo c'est maintenant, ce n'était pas avant. –

1

Je vois au moins une mauvaise chose:

char cabecalho[60]; 

// ... and later ... 

fgets(alunos[i].cabecalho,100,fp); 

Aux dernières nouvelles, 100 est plus grand que 60, vous avez une erreur de dépassement de mémoire tampon.

+0

vole le même – Pedro

1

Je ne comprends pas pourquoi tu fais une fopen 100 fois:

for(i=0;i<100;i++){ 
fp=fopen("trabalho.txt","r"); 
} 

Il suffit de faire:

fp=fopen("trabalho.txt","r"); 
1

En plus de toutes les autres erreurs, vous avez une accolade supplémentaire au-dessus du fclose (fp), ce qui provoque probablement un problème de compilation en raison d'accolades inégalées.

2

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.

+0

tous corrigés, mais apparaît dans la console "", puis planter – Pedro

+0

Can 'fgets' renvoie une chaîne de longueur zéro? Si c'est le cas, vous devrez vérifier cela avant d'utiliser 'strlen (...) - 1' comme index. –

+0

@James, pas pour une ligne normale, non. Il aura toujours une nouvelle ligne. Vous pouvez obtenir des chaînes de longueur nulle sur une condition d'erreur mais je préfère ne pas obstruer le code éducatif au point où il y a 80% de vérification d'erreur :-) L'intention ici est d'enseigner comment le code pour les cas normaux peut fonctionner, (bien qu'il soit vital d'avoir un code robuste) ne ferait que compliquer cela à ce stade (IMNSHO). – paxdiablo

1
void cabclh(ALUNO alunos[],int a){ 
    FILE *fp; 
    int i=0; 

    fp=fopen("trabalho.txt","r"); 

    if(fp==NULL){ 
     printf("Erro ao abrir o ficheiro\n"); 
     return;  
    } 
    while(!feof(fp) && i<100){ 
     fgets(alunos[i].cabecalho,60,fp); 
     printf("%s\n",alunos[i++].cabecalho); 
    } 

fclose(fp); 
} 
+0

sur la console apparaît "" – Pedro