2010-12-09 37 views
1

J'ai une ligne dans un fichier comme ceci: "33 sun 15:00 FCM - SIF 3 - 0". Je dois extraire toutes les données. J'ai ce code jusqu'ici, ce qui fait une petite erreur lors de l'extraction des chaînes "soleil", "FCM" et "SIF". Il fait "soleil" en "sunFCMSIM", "FCM" en "FCMSIF" alors que "SIF" est correct.Lire plusieurs chaînes avec fscanf en C

Vous pouvez simplement créer le fichier d'entrée à partir de plusieurs lignes comme celle ci-dessus. Comment puis-je m'assurer que cette information est extraite correctement?

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

#define LINEBUFFERSIZE 50 
#define TEAMNAMELENGTH 3 
#define WEEKDAYLENGTH 3 

void __construct(char fileName[FILENAME_MAX]) { 
FILE *inputFile; 
char buffer[LINEBUFFERSIZE]; 
// Open input file 
inputFile = fopen(fileName, "r"); 

// Read all matches and create 
while(fgets(buffer, LINEBUFFERSIZE, inputFile) != NULL){ 
    int round, hour, minute, homeGoals, outGoals; 
    char outTeam[TEAMNAMELENGTH], homeTeam[TEAMNAMELENGTH], weekday[WEEKDAYLENGTH]; 

    fscanf(inputFile, "%d %3s %2d:%2d %3s - %3s", &round, weekday, &hour, &minute, homeTeam, outTeam); 
    printf("Round: %d\n", round); 
    printf("%s %02d:%02d\n", weekday, hour, minute); 
    //printf("%s - %s\n", homeTeam, outTeam); 
} 

fclose(inputFile); 
} 

int main() { 
    /*char inputFile[FILENAME_MAX]; 
    printf("Enter input file> "); scanf("%s", &inputFile);*/ 
    __construct("superliga-2009-2010"); 
    return 0; 
} 

Répondre

1

Selon la documentation fscanf, le spécificateur de conversion s:

correspond à une séquence de caractères non-espace blanc; le pointeur suivant doit être un pointeur sur un tableau de caractères suffisamment long pour contenir la séquence d'entrée et le caractère nul final ('\ 0'), qui est ajouté automatiquement.

Vos tampons ne sont pas assez grands pour accueillir le terminateur NULL. Si vous résoudre ce problème, par exemple en déclarant outTeam, homeTeam et weekday comme suit:

char outTeam[TEAMNAMELENGTH + 1], homeTeam[TEAMNAMELENGTH + 1], weekday[WEEKDAYLENGTH + 1]; 

Votre code fonctionne comme prévu.

+1

Que Dieu vous bénisse :) Merde j'ai raté ça :) Merci mon pote –