web-dev-qa-db-fra.com

Lecture d'un fichier à l'aide de fscanf () en C

J'ai besoin de lire et d'imprimer des données à partir d'un fichier.
J'ai écrit le programme comme ci-dessous,

#include<stdio.h>
#include<conio.h>
int main(void)
{
char item[9], status;

FILE *fp;

if( (fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL)
{
    printf("No such file\n");
    exit(1);
}  

 if (fp == NULL)
{
    printf("Error Reading File\n");
}

while(fscanf(fp,"%s %c",item,&status) == 1)  
{  
       printf("\n%s \t %c", item,status);  
}  
if(feof(fp))  
{            
         puts("EOF");     
}  
else  
{  
 puts("CAN NOT READ");  
}  
getch();  
return 0;  
}  

le fichier database.txt contient
Test1 A
Test2 B
Test3 C

Lorsque j'exécute le code, il imprime

NE PEUT PAS LIRE.

S'il vous plaît, aidez-moi à découvrir le problème.

15
Guru

Tout d'abord, vous testez fp deux fois. donc printf("Error Reading File\n"); n'est jamais exécuté.

Ensuite, la sortie de fscanf doit être égale à 2 puisque vous lisez deux valeurs.

26
Hamid Nazari

scanf() et amis renvoient le nombre d'éléments saisis avec succès. Pour votre code, ce serait deux ou moins (en cas de moins de correspondances que spécifié). Bref, soyez un peu plus prudent avec les pages de manuel:

#include <stdio.h>
#include <errno.h>
#include <stdbool.h>

int main(void)
{
    char item[9], status;

    FILE *fp;

    if((fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL) {
        printf("No such file\n");
        exit(1);
    }

    while (true) {
        int ret = fscanf(fp, "%s %c", item, &status);
        if(ret == 2)
            printf("\n%s \t %c", item, status);
        else if(errno != 0) {
            perror("scanf:");
            break;
        } else if(ret == EOF) {
            break;
        } else {
            printf("No match.\n");
        }
    }
    printf("\n");
    if(feof(fp)) {
        puts("EOF");
    }
    return 0;
}
12
Michael Foukarakis

Dans votre code:

while(fscanf(fp,"%s %c",item,&status) == 1)  

pourquoi 1 et non 2? Les fonctions scanf renvoient le nombre d'objets lus.

3
anon

fscanf traitera 2 arguments, et donc retournera 2. Votre instruction while sera fausse, donc n'affichera jamais ce qui a été lu, plus comme elle n'a lu qu'une seule ligne, si elle n'est pas à EOF, ce qui vous donne ce que vous voir.

1
Didier Trosset