2012-11-25 2 views
0

A écrit ce programme qui devrait être en mesure d'imprimer toutes les lignes d'un fichier txt, mais il imprime seulement un, regardé depuis 1 heure maintenant et je ne trouve pas l'erreur, tout l'aide serait appriciée! :)Programme ne pas imprimer toutes les lignes du fichier txt

1 16.07.2011 kl. 17,00 OB - FCN 2 - 0 6,965
1 17.07.2011 kl. 14,00 FCM - SIF 1 - 2 5,370
1 17.07.2011 kl. 16,00 ACH - HBK 3 - 0 2.227
1 17.07.2011 kl. 16.00 SDR - FCK 0 - 2 4.992
les 4 premières lignes.

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_LINE_LGT 200 
#define NAME_MAX 200 
#define TEAM_MAX 200 

struct team{ 
char name[NAME_MAX]; 
int five_or_more_goals; 
}; 
typedef struct team team; 

void read_data_1(const char *file_name, team teams[]){ 
FILE *ifp; 
char team1[NAME_MAX]; 
char team2[NAME_MAX]; 
int goal1, goal2; 
int dag, month, year; 
double clock; 
int attendance; 
int round; 
team local_match; 

ifp = fopen(file_name, "r"); 

while (fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %d\n", &round, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10){ 
    printf("runde %d den %d %d %d klokken %.2lf, mellem %s og %s endte %d - %d %d så kampen\n", round, dag, month, year, clock, team1, team2, goal1, goal2, attendance); 
    } 

fclose(ifp); 

    } 

    int main(void) { 
    team all_matches_teams[TEAM_MAX]; 
    read_data_1("superliga-2011-2012", all_matches_teams); 

return 0; 
} 
+1

Il est impossible de dire ce qui se passe sans voir votre fichier. En fait, pas même le fichier entier: les trois ou quatre premières lignes devraient suffire. – dasblinkenlight

+2

Je supprimerais le '\ n' de la fin de la chaîne de format - il va être ignoré de toute façon, et la dernière ligne ne peut en contenir un. – dasblinkenlight

+0

Que retourne fscanf la deuxième fois? –

Répondre

1

Votre valeur de présence à la fin de chaque ligne d'entrée est à l'origine du problème. Vous devrez soit l'analyser sous la forme d'un flottant ou de deux décimales séparées par une période, et pas seulement une seule décimale. Il devrait travailler avec les modifications du code ci-dessous, en supposant la participation n'a jamais atteint un million:

int valuesRead; 
int attendance; 
int attend1, attend2; 
[...] 
while ((valuesRead = fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %d.%d\n", &round, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attend1, &attend2)) >= 10){ 
    if (valuesRead == 11) 
     attendance = attend1 * 1000 + attend2; 
    else 
     attendance = attend1; 
    printf("runde %d den %d %d %d klokken %.2lf, mellem %s og %s endte %d - %d %d så kampen\n", round, dag, month, year, clock, team1, team2, goal1, goal2, attendance); 
} 
+0

Je reçois un défaut Segmentation (core dumped) en vérifiant le scanf et printf et voir si les correspondances – Winkz

+0

Semble que je ne peux pas le faire fonctionner, la faute de segmentation encore (core dumped) – Winkz

0

Merci pour les gars d'entrée, je l'ai travaille maintenant, en changeant simplement la variable de présence à un double et il fonctionne très bien, Heres le code à nouveau, si quelqu'un a des conseils pour l'écrire plus intelligemment, faites le moi savoir! :)

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_LINE_LGT 200 
#define NAME_MAX 200 
#define TEAM_MAX 200 

struct team{ 
char name[NAME_MAX]; 
int five_or_more_goals; 
}; 
typedef struct team team; 

void read_data_1(const char *file_name, team teams[]){ 
FILE *ifp; 
char team1[NAME_MAX]; 
char team2[NAME_MAX]; 
int goal1, goal2; 
int dag, month, year; 
double clock; 
double attendance; 
int round; 
team local_match; 

ifp = fopen(file_name, "r"); 

while (fscanf(ifp, "%d %d.%d.%d kl. %lf %4s - %4s %d - %d %lf\n", &round, &dag, &month, &year, &clock, team1, team2, &goal1, &goal2, &attendance) == 10){ 
    printf("runde %d den %d %d %d klokken %.2lf, mellem %s og %s endte %d - %d %.3lf så kampen\n", round, dag, month, year, clock, team1, team2, goal1, goal2, attendance); 
    } 

fclose(ifp); 

    } 

    int main(void) { 
    team all_matches_teams[TEAM_MAX]; 
    read_data_1("superliga-2011-2012", all_matches_teams); 

    return 0; 
    } 
+0

Heureux que vous le sachiez, mais un commentaire: Au moment où la présence est une valeur inférieure à 1000, dites «x», votre participation imprimée est x.000. C'est la raison pour laquelle je pensais gérer les valeurs comme des entiers, bien que j'imagine que ma réponse affichée devrait être rendue plus robuste. –

+0

Ah je vois, peut voir que pourrait causer des problèmes, mais Dieu merci theres pas où la fréquentation est inférieure à 1000 hehe :) im encore nouveau à c, mais je vous remercie beaucoup pour votre contribution – Winkz

+0

Oh parfait. Je n'étais pas sûr des contraintes, c'est pourquoi je ne voulais pas aller trop loin, mais c'est super, je suis content que vous ayez une solution! :) –

Questions connexes