2015-11-24 2 views
0

Cette tâche consiste à obtenir la première ligne en tant que titre puis à calculer les données d'un fichier, le nombre moins est entre parenthèses. Il imprimera le titre et la somme de ces données. chaque ligne est terminée par un caractère de nouvelle ligne. Je ne sais pas quel est le problème. Je ne sais pas comment faire face à "Erreur de bus 10". Peut-être à cause de l'allocation de la mémoire, je n'ai aucune idée ... Quelqu'un peut-il m'aider?get "Erreur de bus 10": un programme pour prendre les données d'un fichier et calculer

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


// Our definition of a structure to represent department data. 
struct dept { 
    int id; 
    char *name; 
    int balance; 
    struct dept *next; 
}; 
typedef struct dept dept_t; 



// For (a) 
dept_t *create_dept(int dept_id, char *dept_name, int dept_balance); 
// For (b) 
dept_t *load_dept(int id); 
// For (c) 
void free_dept(dept_t *dept); 
// For (d) 
void print_dept(dept_t *dept); 


int main(int argc, char *argv[]) 
{ 
    dept_t *d = load_dept(51423); 
    print_dept(d); 
    free_dept(d); 
} 


// (a) 
dept_t *create_dept(int dept_id, char *dept_name, int dept_balance) 
{ 
    dept_t *d = malloc(sizeof(dept_t)); 
    d->id = dept_id; 
    d->name = dept_name; 
    d->balance = dept_balance; 
    d->next = NULL; 
    return d; 
} 


// (b) 

char *prompt(FILE *fp) 
{ 
    char ch; 

    // skip leading whitespace 
    do 
    { 
     fscanf(fp, "%c", &ch); 
     if(feof(fp)) 
     { 
    return NULL; 
     } 
    } while(ch == '\n'); 

    // read in until whitespace 
    int cur_size = 8; 
    char *str = malloc(sizeof(char) * cur_size); 
    int cur_pos = 0; 
    str[cur_pos] = ch; 
    cur_pos++; 
    do 
    { 
     fscanf(fp, "%c", &ch); 
     if(feof(fp)) 
     { 
    str[cur_pos] = '\0'; 
    return str; 
     } 
     str[cur_pos] = ch; 
     cur_pos++; 
     if(cur_pos >= cur_size - 1) 
     { 
    cur_size = cur_size * 2; 
    str = realloc(str, sizeof(char) * cur_size); 
     } 
    } while(ch != '\n'); 
    str[cur_pos - 1] = '\0'; 

    return str; 
} 

dept_t *load_dept(int id) 
{ 

    FILE *fp; 
    char *filename; 
    int balance = 0; 
    char *name; 
    char *string; 
    int i; 
    dept_t *d; 

    filename = malloc(sizeof(char)*10); 


    sprintf(filename,"%d.txt",id); 


    if((fp = fopen(filename,"r")) == NULL) 
    { 
     fprintf (stdout,"Can't open \"%s\"file.\n",filename); 
     exit(1); 
    } 


    name = prompt(fp); 

    int value; 
    for(i=0;i<6;i++) 
    { 
    string = prompt(fp); 
    if (string[0]=='(') 
    { 
     value = atoi(&string[1]); 
     balance = balance - value; 
    }  
    else 
    { 
     value = atoi(string); 
     balance = balance + value; 
    }  
    } 
    free(string); 

    free(filename); 
    if(fclose(fp)!=0) 
    { 
     fprintf(stderr,"Error closing file\n"); 
    } 



    d = create_dept(id,name,balance); 

    return d; 


} 

// For (c) 
void free_dept(dept_t *dept) 
{ 
    free(dept->name); 
    free(dept); 
} 


// For (d) 
void print_dept(dept_t *dept) 
{ 

    printf("Department: %s",dept->name); 
    printf("  %d",dept->balance); 
} 
+0

Je ne sais vraiment pas comment y faire face. J'essaye plusieurs fois mais je ne trouve pas la raison. Je suis un débutant de c. S'il vous plaît aidez-moi, merci beaucoup! – happyeveryday

+0

Le code affiché ne compile pas proprement. Lors de la compilation, activez tous les avertissements, puis corrigez ces avertissements. (pour gcc, utilisez au minimum: -Wall -Wextra -pedantic'). Pour commencer, les paramètres de main() 'argc' et' argv [] 'ne sont pas utilisés. Suggérer de déclarer main() comme: int int (void) ' – user3629249

+0

le code affiché utilise le nom de la balise struct comme nom de paramètre pour certaines fonctions. c'est une mauvaise pratique de programmation. Suggérer fortement d'utiliser des noms uniques pour les paramètres transmis. – user3629249

Répondre

0

Depuis, comme user3629249 a noté, la fonction: prompt() peut retourner un pointeur NULL, vous devez changer

for(i=0;i<6;i++) 
    { 
    string = prompt(fp); 

à

while (string = prompt(fp)) 
    { 

(alors moins de 6 lignes de données ne provoquera pas de faute).