2013-06-25 1 views
0

Je voulais écrire, lire et imprimer à partir du même fichier. Mais quand le programme s'exécute, il peut écrire mais il ne peut pas lire ou imprimer les données que j'ai écrites. Lorsque j'exécute le programme, il cesse de fonctionner après avoir écrit dans le fichier. J'ai vérifié que le fichier (penny.txt) contient des données après l'opération d'écriture.Erreur de gestion de fichier C

Je ne sais pas où cela ne va pas - comment puis-je lire et imprimer les données? Je suis assez nouveau à ce sujet, alors s'il vous plaît, gardez cela à l'esprit lorsque vous répondez.

#include<stdio.h> 

int main() 
{ 
    char ch; 
    char penny[50],pen[50]; 
    FILE *Object; 
    Object = fopen("Penny.txt","w+"); 

    fgets(penny, sizeof penny, stdin); 
    fprintf(Object,penny); 
    fscanf(Object,"%s",pen); 
    printf("%s",pen); 
    return 0; 
} 
+0

Un conseil: à la fin vous devriez fclose (Object); –

+0

Bienvenue dans StackOverflow! Pour nous aider à vous aider, veuillez publier des exemples d'entrée et de sortie et décrire en quoi cela diffère de ce que vous voulez. –

+0

Rincez la sortie après l'écriture – wazy

Répondre

1
#include<stdio.h> 

int main() 
{ 
    //char ch;//unused! 
    char penny[50],pen[50]; 
    FILE *Object; 
    Object = fopen("Penny.txt","w+"); 

    fgets(penny, sizeof penny, stdin); 
    fprintf(Object,"%s", penny);//it troubled indicator(%) is included 
    fflush(Object);//Buffer flush : So that there is no wrote 
    rewind(Object);//rewind the position of access to the file 
    fscanf(Object,"%s",pen); 
    printf("%s",pen); 
    return 0; 
} 
1

Vous devez utiliser fseek() pour déplacer le fichier sur la position actuelle à l'intérieur du fichier.

int fseek (FILE * stream, long int offset, int origin); 

indicateur de position de flux Repositionner Définit l'indicateur de position associé au flux vers une nouvelle position.

stream 

Pointeur vers un objet FILE qui identifie le flux. offset Fichiers binaires: nombre d'octets à décaler par rapport à l'origine. Fichiers texte: zéro, ou une valeur renvoyée par ftell.

origin 

Position utilisée comme référence pour le décalage. Il est précisé par l'une des constantes suivantes définies dans exclusivement pour être utilisés comme arguments pour cette fonction:

Constant Reference position 
SEEK_SET Beginning of file 
SEEK_CUR Current position of the file pointer 
SEEK_END End of file 

*

essayez ceci:

#include<stdio.h> 

int main() 
    { 
     char ch; 
     char penny[50],pen[50]; 
     FILE *Object; 
     Object = fopen("Penny.txt","w+"); 

     fgets(penny, sizeof penny, stdin); 
     fprintf(Object,penny);//now the file is in EOF 
     fseek(Object,-1*(strlen(penny),SEEK_CUR);//<===move back |penny| in the file 
     /* optional or:fseek(Object,0,SEEK_SET);<===move to start of file */ 
     fscanf(Object,"%s",pen); 
     printf("%s",pen); 
     return 0; 
    } 
+0

['fgets'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html) peut ne pas avoir lu 'sizeof penny' bytes. – user7116

+0

vous droite je le change en strlen() –

1

Vous êtes à la fin de le fichier lorsque vous appelez fscanf(). Utilisez fseek pour revenir au début:

/* this ignores a whole host of other issues */ 
fprintf(Object,penny); 
/* optional: fflush(Object); */ 

/* after the call to fprintf you're at the end of the "stream" in this case, 
* go back to the beginning: 
*/ 
fseek(Object, 0, SEEK_SET); 

/* now we have something to read! */ 
fscanf(Object,"%s",pen); 
printf("%s\n",pen); 

Vous n'avez pas remarqué ce problème en raison d'une absence totale de contrôle d'erreur. fopen, fprintf et fscanf ont toutes des conditions d'erreur répertoriées et toutes utilisent leur valeur de retour pour signaler un problème. Vous ignorez ces valeurs de retour à vos risques et périls.