2010-10-12 5 views
1
#include<stdio.h> 
#include<ctype.h> 

int main() { 

    FILE *fpin = fopen("in.txt", "r"); 
    fprintf(fpin, "hello, world!"); 
    fclose (fpin); 

    char c; 
    fpin = fopen("in.txt", "r"); 
    FILE *fpout = fopen("out.txt", "w"); 
    while ((c = fgetc(fpin)) != EOF) { 
     fputc (toupper(c), fpout); 
    } 

    fclose (fpout); 
    fclose (fpin); 
    return 0; 
} 

Je reçois unQu'est-ce qui ne va pas avec l'écriture dans ce fichier?

Segmentation fault

Merci.

+2

apprendre à utiliser un débogueur – pm100

Répondre

10

Je ne sais pas quoi que ce soit au sujet de C, mais est semble que vous écrivez dans un fichier que vous avez ouvert en lecture seule ...

FILE *fpin = fopen("in.txt", "r"); 
fprintf(fpin, "hello, world!"); 

devrait probablement:

FILE *fpin = fopen("in.txt", "w"); 
fprintf(fpin, "hello, world!"); 
+1

Et si ce n'est pas SEGV, vous n'êtes pas vérifier la valeur de retour du second fopen donc depuis la première ne crée pas, la seconde échouera et vous aurez une Pointeur NULL dans fpin ... –

4

Ils ont d'abord les problèmes que je vois est que vous ne vérifiez pas le succès de l'appel fopen. Il peut échouer et provoquer fpin être NULL ce qui conduirait à des problèmes plus tard dans le code.

FILE *fpin = fopen("in.txt", "r"); 
if (!fpin) { 
    printf("Error opening in.txt"); 
    return EXIT_FAILURE; 
} 
1

Très probablement, l'un de vos appels fopen échoue et retour NULL. Le candidat le plus probable est la ligne suivante:

FILE *fpin = fopen("in.txt", "r"); 

Vous vouliez probablement dire d'utiliser un "w" ici, comme vous essayez plus tard d'écrire dans le fichier. Je devine que le fichier n'existe pas encore ... et par conséquent, lorsque vous essayez de l'ouvrir avec "r", l'appel fopen échoue.

3
  1. Changer votre char c; à int c; - fgetc retourne un entier.
  2. Vérifiez la valeur de retour des appels à fopen pour voir si vous obtenez un retour NULL.
  3. Modifiez le mode du premier fopen à "w" afin de pouvoir écrire dans le fichier.
  4. Vous pouvez envisager d'ajouter un \n à la fin de "hello world!".
+0

+1: Et j'ajouterais aussi: 5. compiler avec tous les avertissements dessus; 6. Si vous posez des questions sur SO, donnez une description plus précise de l'erreur (dans quelle ligne votre erreur s'est-elle produite ...) –