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

  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 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+

  6. #6
    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.

  7. #7
    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+

  8. #8
    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.....

  9. #9
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par orj30754
    Le principal c'est que ca fonctionne et chez moi ca marche. Je peux meme te filer le exe si tu veux vérifier.....
    Pas mal comme justification.
    J'aimerai bien voir tes options de compilation aussi.

  10. #10
    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
    Le principal c'est que ca fonctionne et chez moi ca marche. Je peux meme te filer le exe si tu veux vérifier.....
    Non, ce n'est pas une justification valable. Ca fonctionne en "ligne droite" mais dès que tu pars dans un cas particulier, ça part à volo, j'en suis certain.

    Personnellement, le code que tu as montré, avec moi => poubelle. Je ne travaille pas dans la logistique, je travaille dans les télécommunications sur des systèmes haute-disponibilité, donc tu comprendras facilement qu'un code comme celui que tu as sorti n'a pas sa place dans un domaine où il y a des exigences importantes sur la sécurité et le traitement d'erreur. Je pense qu'en logistique, c'est pareil (liaisons X400 pour transport de messages EDIFACT, etc...).

    Et non, je ne veux pas de virus...

    A+

  11. #11
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut


  12. #12
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    Je sais pas si tu connais le groupe SAVOYE LOGISTIC, ou LEGRIS INDUSTRIES, mais ces fonctions viennent de chez eux et je pense que questions sécurité y sont au point. Faudra que je dise aux ingénieurs que leur code c'est de la merde alors.
    Files moi ton numéro je leur passerai pour que vous puissiez discuter du leur boulot. On sait jamais si t'as des améliorations à leur faire parvenir y seront content........

  13. #13
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    On pourrait dire que l'habit ne fait pas le moine
    On pourrait dire que le fait d'être ingénieur leur ai monté à la tête
    Peut etre qu'ils sont conscients qu'ils font des trucs pas top mais que par approche commerciale, ils preferent se dire qu'ils font des trucs tres robustes et tres sécurisés, mais dans ce cas c'est clairement se voiler la face.

    Peut etre aussi que ce bout de code est vieux et que la majorité de leur code est mieux écrit...

  14. #14
    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.

  15. #15
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par orj30754
    Je sais pas si tu connais le groupe SAVOYE LOGISTIC, ou LEGRIS INDUSTRIES, mais ces fonctions viennent de chez eux et je pense que questions sécurité y sont au point. Faudra que je dise aux ingénieurs que leur code c'est de la merde alors.
    Files moi ton numéro je leur passerai pour que vous puissiez discuter du leur boulot. On sait jamais si t'as des améliorations à leur faire parvenir y seront content........
    Ce ne sont pas des filiales de Microsoft par hasard ???

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