ProgrammatIon dynamique en C

Résolu/Fermé
Signaler
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021
-
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021
-
Salut à tous.

Je dois résoudre cet exercice

On souhaite copier un fichier vers un autre.

Ecrire un programme C qui permet de de le faire facilement. Le programme aura les fonctionnalités suivantes :
  • l'utilisateur indiquera le nom du fichier source ainsi que celui du fichier destination;
  • Si le fichier source n’existe pas, un message d’erreur sera affiché à l’utilisateur.
  • Le programme affichera le fichier source avant la copie, et le fichier destination après la copie.


Et voici mon code :

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

int main()
{
    char n;
    int nbre=1;
    FILE *source;
    char nm_source[30];
    printf("Hello world!\n");
    printf("Entrer le nom du fichier source\n");
    scanf("%s",nm_source);
    source=fopen(nm_source,"r");
    if(source==NULL)
    {
        printf("ERREUR : Le fichier n'existe pas ou ne peux pas etre ouvert\n");
    }else
    {
        FILE *dest;
        char nm_dest[30];
        printf("Entrer le nom du fichier de destination\n");
        scanf("%s",nm_dest);
        dest=fopen(nm_dest,"a+");
        while(fread(&n,1,nbre,source)!= 0)
        {
            printf("%c",n);
            fwrite(&n,1,nbre,dest);
            nbre=nbre+1;
        }
        nbre=1;
        printf("Copie en cours...\n");
        while(fread(&n,1,nbre,dest) != 0)
        {
            printf("%c",n);
            nbre=nbre+1;
        }
        fclose(dest);
    }
    fclose(source);
    return 0;
}


Le problème, c'est que quand je mets le nom du fichier source (que j'ai créé en .txt et qui se trouve dans le même répertoire que le main) le programme affiche le message d'erreur comme si le fichier n'existait pas.
Mais avant dites-moi si le programme fera bien la copie.

Merci d'avance

3 réponses

Messages postés
621
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
13 janvier 2022
84
Bonjour,

Une chose certaine le répertoire où se trouve main() et le répertoire à partir duquel on cherche un fichier n'ont rien à voir entre eux. D'ailleurs ton programme exécutable est lui créé dans un autre répertoire, et lui non plus ne correspond pas à l'endroit où on ira chercher les fichiers.
Le répertoire qui compte est le répertoire à partir duquel ton application est lancée. Quand le programme est lancé par l'IDE c'est souvent par défaut le répertoire du projet mais ça se configure.
1
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998
bonjour,
as-tu essayé en spécifiant le nom complet du fichier?
0
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021

Merci j'avais pas pense a l'extension.
Mais le code fait il ce qui est demander ?? J'ai du mal avec les parametres de fread et fwrite...Merci d'avance
0
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998 >
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021

et quel est le résultat?
0
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021
>
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022

Au fait j'ai fait des corrections. Maintenant je retrouve les deux fichiers mais la copie ne se fait. Pour moi la ligne 27 servirait pour la copie. Du genre on lit dans le fichier source caractere par caractere et on ecrit la meme chose dans le fichier de destination.
0
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998 >
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021

"la copie ne se fait": que se passe-t-il avec le fichier destination?
es-tu certain que le contenu du fichier source est correctement affiché? je crains que non!
0
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021
>
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022

C'est le code avec les corrections, le contenu du fichier source s'affiche ensuite celui du fichier de destination mais je m'attends a une copie avant l'affichage du contenu du fichier de destination.


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

int main()
{
char n;
FILE *source;
char nm_source[30];
FILE *dest;
char nm_dest[30],m;
printf("Hello world!\n");
printf("Entrer le nom du fichier source\n");
scanf("%s",nm_source);
source=fopen(nm_source,"r");
if(source==NULL)
{
printf("ERREURE : Le fichier n'existe pas ou ne peux pas etre ouvert\n");
}else
{
printf("\nEntrer le nom du fichier de destination\n");
scanf("%s",nm_dest);
dest=fopen(nm_dest,"a");
printf("Le contenu du fichier source:\n");
while(fread(&n,1,1,source)!= 0)
{
printf("%c",n);
fwrite(&n,1,1,dest);
}
}
fclose(source);
printf("\nLe contenu du fichier destination apres la copie\n");
dest=fopen(nm_dest,"r");
while(fread(&m,1,1,dest) != 0)
{
printf("%c",m);
}
fclose(dest);
return 0;
}
0
Messages postés
621
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
13 janvier 2022
84
Tu as du mal avec les paramètres de fread et fwrite...
- Le plus compliqué c'est le premier, tu as pourtant trouvé. C'est l'adresse où mettre le résultat.
- Les 2nd et 3ème sont la taille des objets à récupérer et le nombre d'objets.
- Le dernier est le fichier, tu as aussi trouvé.
Toi tu veux lire 1 char, ça donne:
while ( fread( &n, sizeof(char), 1, source ) != 0 ) {
    fwrite( &n, sizeof(char), 1, dest );
}


Maintenant on peut tout aussi bien lire 1000 caractères d'un coup, c'est pareil mais ça va "un peu" plus vite (la fonction retourne combien elle a réussi à en lire.)
do {
    char  buffer[1000];
    size_t  nb_read = fread( buffer, sizeof(char), 1000, source );
    fwrite( buffer, sizeof(char), nb_read, dest );
} while ( nb_read == 1000 );// si on en a lu moins de 1000 c'est qu'on a fini

Après tu veux lire le fichier écrit, attention il faut impérativement se remettre au début pour le lire. Un moyen simple c'est de fermer le fichier, puis de le rouvrir en mode lecture seulement.
0
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021

ok je vois merci beaucoup
0
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998 >
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021

peux-tu alors marquer la discussion comme résolue?
0
Messages postés
9
Date d'inscription
mercredi 12 juin 2019
Statut
Membre
Dernière intervention
26 avril 2021
>
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022

oui oui bien sur. Merci
0