2013-10-02 4 views
0

J'ai ces erreurs multiples et les avertissements, et j'ai essayé à peu près tout et ne peux pas le comprendre. Votre aide est grandement appréciée! Ceci est mon code:Copiez un fichier dans une autre erreur dans c

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

int main() 
{ 
    /* Create Usable Variables */ 
    FILE *src_p, *dst_p; 
    char src_file[20], dst_file[20]; 
    char c; 

    /* Retrieve Source File Name From User */ 
    printf("Enter Source File Name:\n"); 
    fgets(src_file, 19, stdin); 

    /* Attempt Opening Source File For Reading */ 
    if((src_p = fopen(src_file, "r")) == NULL) 
    { 
     printf("ERROR: Source File Failed To Open...\n"); 
     return(-1); 
    } 

    /* Retrieve Destination File Name From User */ 
    printf("Enter Destination File Name:\n"); 
    fgets(dst_file, 19, stdin); 

    /* Attempt Opening Destination File For Writing */ 
    if((dst_p = fopen(dst_file, "w")) == NULL) 
    { 
     fclose(src_p); 
     printf("ERROR: Destination File Failed To Open...\n"); 
     return(-2); 
    } 

    /* Copy Source File Contents Into Destination File */ 
    while((c = fgetc(src_p)) != EOF) 
     fputc(c, dst_file); 

    /* Close Files On Success */ 
    fclose(src_p); 
    fclose(dst_p); 

    return 0; 
} 

et l'erreur lorsque je tente de compiler est la suivante:

copyfile.c: En fonction 'principale': copyfile.c: 44: 3: avertissement : passage de l'argument 2 de 'fputc' d'un type de pointeur incompatible [activé par défaut] Dans le fichier inclus de copyfile.c: 1: 0: /usr/include/stdio.h:573:12: remarque: 'struct FILE' attendu * 'mais l'argument est de type' char * '

Votre aide est grandement appréciée ed !!

Répondre

0

Vous devez vous rendre compte que lorsque vous ignorez le nom de fichier, vous lisez une ligne d'entrée qui inclut (en fonction du système d'exploitation) un saut de ligne, un retour chariot, ou les deux. Vous avez donc besoin d'un moyen pratique pour supprimer ces caractères inutiles. Empruntant une idée à perl, et al, j'aime chomp(), qui supprime les '\ n' et '\ r' de la fin de la ligne.

Vous devez également faire attention avec vos noms de fichiers par rapport aux gestionnaires de fichiers, le fputc sur le nom de fichier plutôt que le gestionnaire de fichiers.

Et char [20] est plutôt petit pour un nom de fichier, essayez 200+; et vous pourriez trouver que "w +" créera le fichier de sortie quand il n'existe pas; et utilisez sizeof (variable) pour la taille de fgets, plutôt que pour les tailles codées en dur.

Cela fonctionne,

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
char* chomp(char* p) 
{ 
    int len; 
    if(!p) return(p); 
    if((len=strlen(p))<=0) return(p); 
    if(p[len-1] == '\n') { p[--len] = '\0'; } 
    if(p[len-1] == '\r') { p[--len] = '\0'; } 
    return(p); 
} 
int main() 
{ 
    /* Create Usable Variables */ 
    FILE *src_fh, *dst_fh; 
    char src_fn[256+1], dst_fn[256+1]; 

    /* Retrieve Source File Name From User */ 
    printf("Enter Source File Name:\n"); 
    fgets(src_fn, sizeof(src_fn), stdin); chomp(src_fn); 

    /* Attempt Opening Source File For Reading */ 
    if((src_fh = fopen(src_fn, "r")) == NULL) 
    { 
     printf("ERROR: Source File %s Failed To Open...\n",src_fn); 
     return(-1); 
    } 

    /* Retrieve Destination File Name From User */ 
    printf("Enter Destination File Name:\n"); 
    fgets(dst_fn, sizeof(dst_fn), stdin); chomp(dst_fn); 

    /* Attempt Opening Destination File For Writing */ 
    if((dst_fh = fopen(dst_fn, "w+")) == NULL) 
    { 
     fclose(src_fh); 
     printf("ERROR: Destination File %s Failed To Open...\n",dst_fn); 
     return(-2); 
    } 

    int ch; 
    /* Copy Source File Contents Into Destination File */ 
    while((ch = fgetc(src_fh)) != EOF) 
    { 
     fputc(ch, dst_fh); 
    } 

    /* Close Files On Success */ 
    fclose(src_fh); 
    fclose(dst_fh); 
    return 0; 
} 
1

Dans votre code dst_file est un char [20] que vous utilisez pour fopen, l'obtention d'un FILE * que vous enregistrez dans dst_p.

Au lieu de fputc(c, dst_file), essayez fputc(c, dst_p).

+0

LOL! Man ... une erreur si simple, un gros mal de tête. Je vous remercie. Je vais accepter votre réponse dans 3 minutes. –

+2

À l'avenir, ces erreurs simples peuvent être facilement corrigées par ** lire attentivement ** les erreurs signalées par votre compilateur. Essayez de lire à nouveau le message d'erreur de gcc et voyez si vous le comprenez avec les informations que @cnicutar vous a données. Vous apprendrez beaucoup de cela – Pankrates

+0

Oui, vous avez raison, merci. Y a-t-il un meilleur débogueur pour C (sans utiliser d'IDE bien sûr)? –

Questions connexes