2009-07-31 4 views
0
#include<stdio.h> 


void main() 
{ 
FILE *fp,*fp1; 
char c; 
fp=fopen("test.txt","r"); 
fp1=fopen("test1.txt","w"); 
c=getc(fp); 
while(c!=EOF) 
{ 
    if (c=="") 
    { 
     c=getc(fp); 
     continue; 
    } 
    else 
     fprintf(fp1,"%s",c); 
    c=getc(fp); 
} 
fclose(fp); 
fclose(fp1); 

} 
+0

Vous avez déjà des réponses à la question spécifique mais en général, avez-vous un débogueur? C'est le meilleur moyen de découvrir la cause au moins immédiate d'une faute de segmentation particulière. – quark

+0

Vous devriez prendre l'habitude de bons noms de variables comme 'file1' &' file2' plutôt que 'fp' &' fp1'. – GManNickG

Répondre

10

Parce que le caractère n'est pas une chaîne.

Essayez fputc. BTW: Le c devrait être int, sinon vous ne serez pas en mesure de détecter EOF. EOF> 255.

+0

Nitpick: EOF est habituellement (mais ne doit pas être) moins de 0. –

5

c=="" aussi ne fonctionnera pas comme vous le pensez.

3

Votre problème est le fprintf ("% s") de la variable c. c n'est pas une chaîne, c'est un caractère unique. Remplacez cette ligne par

fprintf(fp1,"%c",c); 

Et cela fonctionnera. Il existe de meilleurs moyens de copier le contenu d'un fichier dans un autre.

+0

de meilleures façons comme? – Hick

+0

Eh bien, la meilleure façon serait "cp". Mais je suppose que c'est un exercice ou que vous essayez de faire quelque chose de plus intéressant, comme filtrer le contenu pendant la copie. Le plus gros problème avec l'approche ci-dessus est la lecture d'un personnage à la fois est très lent. Au minimum, vous voulez lire et écrire les fichiers un morceau à la fois via read()/write() ou fread()/fwrite() ou similaire avec une taille de bloc d'environ 16k. – Nelson

+0

ouais je dépouille tous les espaces blancs .. en développant un lexer. donc à partir de maintenant, il ne fonctionne pas avec cette méthode – Hick

6

Il y a un certain nombre de problèmes avec le code qui pourraient causer des problèmes.

fp et fp1 doit être vérifié par rapport à NULL après avoir reçu le résultat de fopen pour vérifier les échecs d'ouverture de fichier.

Le type de c doit être int afin que vous puissiez distinguer correctement EOF d'un caractère valide lu correctement.

c == "" tente de comparer la valeur de caractère avec l'adresse d'une chaîne littérale de longueur nulle.

fprintf(fp1,"%s",c) interprète cette valeur de caractère c comme l'adresse d'une chaîne constante et tente de suivre cette adresse pour imprimer une chaîne. C'est l'erreur la plus probable pour provoquer une erreur de segmentation.


Problèmes de style moins importants. La valeur de retour main doit être int. Il est portably correct même si de nombreuses implémentations permettent void main(void). Comme le corps de votre clause if correspond à ce qui se passerait si la boucle courait jusqu'à la fin et est suivie par un continue, il serait probablement plus clair de supprimer cette clause et d'appliquer une instruction if avec le contraire de ce que vous pense c=="" devrait devenir, à ce qui est actuellement l'instruction else.

0

Le code donne une erreur de segmentation en raison d'un accès illégal à la mémoire, fprintf recherche un caractère nul pour se terminer et, dans ce processus, accède à un emplacement mémoire invalide.
Les pointeurs de fichiers doivent également être vérifiés pour null et le code devrait quitter normalement si l'un d'entre eux est nul, sinon il provoquera également un segfault.

Questions connexes