2014-04-27 4 views
1
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define MAX 500 
int main(){ 
int JourneyId; 
    char Date[MAX]; 
    int Hour; 
    char BusDriver[MAX]; 
    char Departure[MAX]; 
    char Destination[MAX]; 
    int BusCapacity; 
    FILE * file; 
    file = fopen("Journey.txt" , "rt"); 

    if(file){ 
     while (fscanf(file,"%d,%s,%d,%20[^,],%20[^,],%20[^,],%d", &JourneyId,Date,&Hour,BusDriver,Departure,Destination, &BusCapacity) != EOF){ 
     printf("%d,",JourneyId); 
     printf("%s",BusDriver); 
     } 
    } 
    else{ 
     printf("Error"); 
    } 
    return 1; 
} 

Je veux lire le fichier texte et utiliser ce code pour ajouter BST.But Si je cours, sortie est boucle infinie.Comment puis-je lire le fichier texte? fichier texte que je veux lire:Lecture de texte en C

80,15.04.2014,10,Henry Ford,NewYork,Paris,45 
40,15.04.2014,11,Nikola Tesla,Londra,NewYork,40 
+0

Vous devriez mettre un espace, à la fois avant et après, chaque virgule dans le fichier afin que% s ne lit pas au-delà d'une virgule. Et dans la chaîne de format en conséquence. Cela peut résoudre votre problème. – 1lastBr3ath

+1

'fscanf (fichier,"% d,% 11 [^,],% d,% 20 [^,],% 20 [^,],% 20 [^,],% d ", ...' – BLUEPIXY

+0

J'ai essayé des méthodes que vous offrez mais elle donne le même résultat (Infinite Loop) – Semih

Répondre

0

Comme @BLUPIXY indiqué, les fonctions suivantes (essayé sur SuSE Linux/gcc)

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

#define MAX 500 

int main(){ 
    int JourneyId; 
    char Date[MAX]; 
    int Hour; 
    char BusDriver[MAX]; 
    char Departure[MAX]; 
    char Destination[MAX]; 
    int BusCapacity; 
    FILE *file; 

    file = fopen("Journey.txt" , "rt"); 
    if(file) 
     { 
// while(fscanf(file,"%d,%s,%d,%20[^,],%20[^,],%20[^,],%d", &JourneyId,Date,&Hour,BusDriver,Departure,Destination, &BusCapacity) != EOF){ 
     while(fscanf(file,"%d,%11[^,],%d,%20[^,],%20[^,],%20[^,],%d", &JourneyId,Date,&Hour,BusDriver,Departure,Destination, &BusCapacity) != EOF){ 
     printf("%d,",JourneyId); 
     printf("%s",BusDriver); 
     } 
    } 
else 
    { 
    printf("Error"); 
    } 

return 1; 
} 
+0

J'utilise Windows 8 64 bits et Dev-C++ 5.6.2. J'ai essayé cette méthode et le résultat est le même (boucle infinie) – Semih

+0

Semih, je suis désolé pour vos ennuis. J'utilise gcc sur Suse Linux 11. Il a imprimé les deux champs des deux enregistrements et s'est terminé sans incident. –

+0

Pas de problème, Merci de partager vos connaissances avec moi. :) – Semih

4

Plutôt que de lire un fichier texte à l'aide fscanf(), fortement recommande d'utiliser fgets() puis d'analyser via sscanf(), strtok(), strtol(), etc. Vérifiez toutes les valeurs de retour de fonction. Il est beaucoup plus facile de faire face à l'inattendu - ce qui est certainement ce qui se passe dans le cas d'OP.

L'utilisation du format modifié de

@BLUEPIXY
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define MAX 500 

int main() { 
    int JourneyId; 
    char Date[MAX]; 
    int Hour; 
    char BusDriver[MAX]; 
    char Departure[MAX]; 
    char Destination[MAX]; 
    int BusCapacity; 
    FILE * file; 
    file = fopen("Journey.txt", "rt"); 

    if (file) { 
    char buf[MAX*4 + 20*3 + 6*1 + 3]; 

    while (fgets(buf, sizeof buf, stdin) != NULL) { 
     int cnt = sscanf(buf, "%d,%499[^,],%d,%499[^,],%499[^,],%499[^,],%d", 
       &JourneyId, Date, &Hour, BusDriver, Departure, Destination, 
       &BusCapacity); 
     if (cnt != 7) { 
     printf("Unexpected input \"%s\"", buf); 
     break; 
     } 
     printf("%d,", JourneyId); 
     printf("%s\n", BusDriver); 
    } 
    fclose(file); // Be sure to close 
    } else { 
    printf("Error opening\n"); 
    } 
    return 1; 
}