IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

comment copier une ligne d'un fichier à un autre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Par défaut comment copier une ligne d'un fichier à un autre
    bonjour,
    je voudrais savoir comment je pourrais faire tout dabord pour copier une ligne d'un fichier source a un fichier destination
    - en choisissant le numero de la ligne ou en cherche la ligne qui commence par le mot "resultat" par exemple !
    et puis extraire de cette ligne ensemble de chaine de caracteres et chiffre les chiffre
    merci bien de votre aide

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    Pourquoi tu ne ferai pas une copie de la ligne dans une variable temporaire et tu la copierai dans le fichier_à_copier.

    Je vais te mettre ce que j'aurais mis moi. Sachant que j'ecrirais les fonction après le code principal. Tu n'auras plus qu'a ecrire temporaire dans ton autre fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     FILE *fd_o;
     char temporaire[500];
     char ligne[2000];
     
    if (DBI_ouverture_fichier(&fd_o, " nom_fichier_à_copier", "r") == FALSE)
           return(FALSE);      /*tu ouvres le fichier voir fonction plus bas */
    {
            while ( (!feof(fd_o)) &&  					(fgets(ligne, sizeof(ligne), fd_o) != NULL) )  /* tu lis ligne a ligne */
                   {
    if(strncmp(DBI_cherche_chaine(ligne, "resultat") == TRUE ) 
    {
            strcpy(temporaire, ligne);
    }
     
    }
    }
    /* *******************************************************
    	JO le 24/04/06
    ******************************************************* */
    long CFonction::DBI_ouverture_fichier(FILE **fic, char *nom_fichier, char *mode_fichier)
    {
    	if ((*fic = fopen(nom_fichier, mode_fichier)) == NULL)
    	{	
    		return(FALSE);
    	}
    	return(TRUE);
    }
    /* *******************************************************
    	JO le 24/04/06
    ******************************************************* */
    long CFonction::DBI_cherche_chaine(char *chaine, char *rech)
    {
        char *token;
    	char rech_tmp[2000];
    	int flag;
    	int lng_rech;
    	int lng_rech_1;
    	int lng_chaine;
     
    	flag = 0;
     
    	lng_rech = (int)strlen(rech);
    	lng_rech_1 = lng_rech - 1;
     
    	if (lng_rech == (size_t) 0) return(TRUE);
     
    	if (rech[0] == '^') flag = 1;
    	if (rech[lng_rech_1] == '$') flag = 2;
     
    	switch(flag)
    	{
    	  case 0:
    		token = strstr(chaine, rech);
    		if (token == (char *)0) return(FALSE);
    		break;
     
    	  case 1:
    		/* commence par */
    		strcpy(rech_tmp, rech +1);
    		if (strncmp(chaine, rech_tmp, lng_rech_1)) return(FALSE);
    		break;
     
    	  case 2:
    		/* finit par */
    		strcpy(rech_tmp,rech);
    		rech_tmp[lng_rech_1] = 0;
    		lng_chaine = (int)strlen(chaine);
     
    		if (lng_chaine < lng_rech_1) return(FALSE);
    		if (strcmp(chaine + lng_chaine - lng_rech_1, rech_tmp)) return(FALSE);
    		break;
    	}
     
        return(TRUE);
    }
    N oublie pas de fermer les fichiers à la fin

  3. #3
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par orj30754
    Pourquoi tu ne ferai pas une copie de la ligne dans une variable temporaire et tu la copierai dans le fichier_à_copier.

    Je vais te mettre ce que j'aurais mis moi. Sachant que j'ecrirais les fonction après le code principal. Tu n'auras plus qu'a ecrire temporaire dans ton autre fichier.

    FILE *fd_o;
    char temporaire[500];
    char ligne[2000];

    if (DBI_ouverture_fichier(&fd_o, " nom_fichier_à_copier", "r") == FALSE)
    return(FALSE); /*tu ouvres le fichier voir fonction plus bas */
    {
    while ( (!feof(fd_o)) && (fgets(ligne, sizeof(ligne), fd_o) != NULL) ) /* tu lis ligne a ligne */
    {
    if(strncmp(DBI_cherche_chaine(ligne, "resultat") == TRUE )
    {
    strcpy(temporaire, ligne);
    }

    }
    }
    /* *******************************************************
    JO le 24/04/06
    ******************************************************* */
    long CFonction:BI_ouverture_fichier(FILE **fic, char *nom_fichier, char *mode_fichier)
    {
    if ((*fic = fopen(nom_fichier, mode_fichier)) == NULL)
    {
    return(FALSE);
    }
    return(TRUE);
    }
    /* *******************************************************
    JO le 24/04/06
    ******************************************************* */
    long CFonction:BI_cherche_chaine(char *chaine, char *rech)
    {
    char *token;
    char rech_tmp[2000];
    int flag;
    int lng_rech;
    int lng_rech_1;
    int lng_chaine;

    flag = 0;

    lng_rech = (int)strlen(rech);
    lng_rech_1 = lng_rech - 1;

    if (lng_rech == (size_t) 0) return(TRUE);

    if (rech[0] == '^') flag = 1;
    if (rech[lng_rech_1] == '$') flag = 2;

    switch(flag)
    {
    case 0:
    token = strstr(chaine, rech);
    if (token == (char *)0) return(FALSE);
    break;

    case 1:
    /* commence par */
    strcpy(rech_tmp, rech +1);
    if (strncmp(chaine, rech_tmp, lng_rech_1)) return(FALSE);
    break;

    case 2:
    /* finit par */
    strcpy(rech_tmp,rech);
    rech_tmp[lng_rech_1] = 0;
    lng_chaine = (int)strlen(chaine);

    if (lng_chaine < lng_rech_1) return(FALSE);
    if (strcmp(chaine + lng_chaine - lng_rech_1, rech_tmp)) return(FALSE);
    break;
    }

    return(TRUE);
    }

    N oublie pas de fermer les fichiers à la fin
    Pas du C, des globales affreuses, et aussi.

    A+

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Par défaut
    bonjour,
    je voudrai extraire les valeurs d un fichier nomme "stat.txt", a un autre fichier que j ai appele "resultat.txt",
    pour cela j ai fais le code suivant, mais ca ne marche pas, est ce que quelqu un pourai me le couriger,
    while ( !feof(stat)){

    if (fgets(&line,&n,stat))
    if (strstr(line,"Processor") != NULL)
    fputs(line,stat);
    if (strstr(line,"stat.txt") != NULL){
    fscanf(stat,"%s%f%s%s%s",ch,&val_p,ch1,ch2,ch3);
    fputs(line,stat);
    }
    merci a l avance

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    Citation Envoyé par Foobar1329
    Hello,



    Pas du C, des globales affreuses, et aussi.

    A+
    Je t'explique j'avais fait ca pour créer une interface graphique, maintenant il suffit d'adapter le code.
    En tout cas les fonctions que j'ai mises à la fin sont faites par une entreprise d'informatique logistique national ou je suis en train de faire mon stage donc je pense pas que le code soit faut.
    Sur mon projet ca marche super.

  6. #6
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par orj30754
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FILE *fd_o;
    char temporaire[500];
    char ligne[2000];
     
    if (DBI_ouverture_fichier(&fd_o, " nom_fichier_à_copier", "r") == FALSE)
    return(FALSE); /*tu ouvres le fichier voir fonction plus bas */
    {
    while ( (!feof(fd_o)) && (fgets(ligne, sizeof(ligne), fd_o) != NULL) ) /* tu lis ligne a ligne */
    {
    feof() n'est pas utilisé correctement ( feof() indique qu'on on a tenté de lire après la fin du fichier, ce n'est pas prédictif).
    La drapeau de fin de fichier pour feof() est mis à jour seulement quand la fin de fichier est rencontree, soit quand à minima fgets() a renvoyé NULL.
    Bref, il ne sert à rien.

    Citation Envoyé par orj30754
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    if(strncmp(DBI_cherche_chaine(ligne, "resultat") == TRUE ) 
     
    {
    strcpy(temporaire, ligne);
    }
    Si je met une ligne de 1000 caractères dans le fichier avec "resultat" au début ( il manque un paramètre au strncmp() et une parenthèse au niveau du if, ça ne compile même pas... ) , ça fait boum dans le strcpy() qu'il ya en dessous...

    Citation Envoyé par orj30754
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
     
    }
    }
    /* *******************************************************
    JO le 24/04/06
    ******************************************************* */
    long CFonction:BI_ouverture_fichier(FILE **fic, char *nom_fichier, char *mode_fichier)
    {
    if ((*fic = fopen(nom_fichier, mode_fichier)) == NULL)
    { 
    return(FALSE);
    }
    return(TRUE);
    }
    Comme ça, si *fic != NULL, c'est la fête, tu peux éventuellement écraser un handle de fichier valide.

    Citation Envoyé par orj30754
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /* *******************************************************
    JO le 24/04/06
    ******************************************************* */
    long CFonction:BI_cherche_chaine(char *chaine, char *rech)
    {
    char *token;
    char rech_tmp[2000];
    int flag;
    int lng_rech;
    int lng_rech_1;
    int lng_chaine;
     
    flag = 0;
     
    lng_rech = (int)strlen(rech);
    lng_rech_1 = lng_rech - 1;
    Boum dans strlen() si rech est NULL.

    Citation Envoyé par orj30754
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    if (lng_rech == (size_t) 0) return(TRUE);
     
    if (rech[0] == '^') flag = 1;
    if (rech[lng_rech_1] == '$') flag = 2;
     
    switch(flag)
    {
    case 0:
    token = strstr(chaine, rech);
    if (token == (char *)0) return(FALSE);
    break;
     
    case 1:
    /* commence par */
    strcpy(rech_tmp, rech +1);
    if (strncmp(chaine, rech_tmp, lng_rech_1)) return(FALSE);
    break;
    Boum si chaine est NULL.

    Citation Envoyé par orj30754
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    case 2:
    /* finit par */
    strcpy(rech_tmp,rech);
    rech_tmp[lng_rech_1] = 0;
    lng_chaine = (int)strlen(chaine);
     
    if (lng_chaine < lng_rech_1) return(FALSE);
    if (strcmp(chaine + lng_chaine - lng_rech_1, rech_tmp)) return(FALSE);
    break;
    }
     
    return(TRUE);
    }
    Heureusement que 0 est assigné à flag, car il n'y a pas de label default dans ton switch() => UB.
    Sans compter que tu ne précises pas d'où sortent tes TRUE et FALSE, même si on suppose que c'est sous Windows ...
    <c++>
    D'autre part, vu qu'il apparait que c'est du C++, rappelons qu'il y a std::string ou sûrement un type C++ de l'implémentation
    qui serait plus approprié pour manipuler des chaines que char...
    </c++>

    Citation Envoyé par orj30754
    Je t'explique j'avais fait ca pour créer une interface graphique, maintenant il suffit d'adapter le code.
    En tout cas les fonctions que j'ai mises à la fin sont faites par une entreprise d'informatique logistique national ou je suis en train de faire mon stage donc je pense pas que le code soit faut.
    Sur mon projet ca marche super.
    Oh, ben oui, c'est un sacré gage de qualité

    A+

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    Le principal c'est que ca fonctionne et chez moi ca marche. Je peux meme te filer le exe si tu veux vérifier.....

  8. #8
    Membre confirmé Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Par défaut
    Citation Envoyé par orj30754
    En tout cas les fonctions que j'ai mises à la fin sont faites par une entreprise d'informatique logistique national ou je suis en train de faire mon stage donc je pense pas que le code soit faut.
    Sur mon projet ca marche super.
    Tu es sûr d'être en stage ou tu es salarier et tu ne veux pas l'avouer?! Défendre autant une société où l'on est stagiaire...!!??Bizare.

  9. #9
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par debutant-1
    bonjour,
    je voudrais savoir comment je pourrais faire tout dabord pour copier une ligne d'un fichier source a un fichier destination
    - en choisissant le numero de la ligne ou en cherche la ligne qui commence par le mot "resultat" par exemple !
    et puis extraire de cette ligne ensemble de chaine de caracteres et chiffre les chiffre
    merci bien de votre aide
    Ouvrir un fichier source et un fichier destination avec fopen()

    Lire le fichier ligne par ligne avec fgets(),
    Suivant le type de recherche de ligne :
    -> par numéro : arrêter la boucle de lecture avec fgets() à la n-ième ligne voulue.
    -> par chaine en début de ligne : puis utiliser strstr() pour vérifier si la ligne commence par "resultat".

    La ligne obtenue, la recopier dans le fichier destination avec fputs().

    A+

Discussions similaires

  1. Comment copier une ligne de JTable dans un autre JTable
    Par coolanso dans le forum Composants
    Réponses: 2
    Dernier message: 03/11/2011, 08h36
  2. [VBA]comment copier une ligne vers un autre classeur
    Par iboulaye1980 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/05/2007, 18h22
  3. copier une ligne d'un fichier
    Par wiss20000 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 01/03/2007, 18h51
  4. comment copier une table vers un fichier texte ou le contraire
    Par kham40 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/11/2006, 13h51
  5. Comment Copier une table dans un fichier?
    Par thx2003 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/12/2003, 12h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo