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 :

Ecrire dans un fichier par colone


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 124
    Par défaut Ecrire dans un fichier par colone
    Salut à vous!
    Je suis entrain d'écrire un programme dans lequel je désire écrire dans un fichier csv en ligne puis en colonne les résultats de mes calculs. Je précise que le nombre de ligne varie d'une colonne a une autre. Voici le programme que j'ai écris

    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
     
     
     #include <stdio.h>
    #include <gsl/gsl_sf_bessel.h>
     #include<gsl/gsl_randist.h>
    #include<time.h>
    #include<gsl/gsl_rng.h>
    #include<math.h>
    #include<vector>
    #include <iterator>
    #include <iostream>
    #include <fstream>
    using namespace std;
    // g++ ecr.cpp -L/home/njepnou/dev/lib -I/home/njepnou/dev/include -lgsl -lgslcblas -lm
     
    int main(){
    double u;
    gsl_rng *g;
    g=gsl_rng_alloc(gsl_rng_mt19937);
    gsl_rng_set(g,time(NULL));
     
     u=gsl_rng_uniform(g);
     double T[]={4,8,9};
     vector<vector<double> >tab(3,vector<double>(1));
     int Taille[]={2,5,7};
    int i,j;
     for (i=0;i<3;i++){
        for(j=0;j<Taille[i];j++){
            tab[i].push_back(T[i]);
        }
     }
        string const nomFichier("fich.csv");
    ofstream monFlux(nomFichier.c_str(),ios::app);
    if(monFlux){
     for (i=0;i<3;i++){
              monFlux << "tableau "<< i << endl;
        for(j=0;j<tab[i].size();j++){
     
        monFlux << tab[i][j] << endl;
           printf("%f\n", tab[i][j]);
     
        }
     }
     
     }
    else
    {
    cout << "ERREUR: Impossible d'écrire dans ce fichier." << endl;
    }
     
    return 0;
    }
    En sorti cela donne bien un fichier 'fich.csv' mais toutes mes données sont sur la mémé ligne. les données sont disposées ainsi

    Nom : sorti.png
Affichages : 571
Taille : 7,4 Ko

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Le moyen le plus simple, c'est de tout mémoriser dans une matrice pour écrire ensuite le fichier une fois pour toutes ligne par ligne.

    Si tu veux vraiment l'écrire par colonnes, tu vas devoir utiliser au moins un fichier temporaire, car on ne peut pas faire d'insertion dans un fichier. Il te faudra alors lire le fichier original ligne par ligne, et l'écrire dans ton temporaire en rajoutant à chaque ligne la nouvelle colonne, etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le moyen le plus simple, c'est de tout mémoriser dans une matrice pour écrire ensuite le fichier une fois pour toutes ligne par ligne.


    Citation Envoyé par Médinoc Voir le message
    on ne peut pas faire d'insertion dans un fichier
    Si mais c'est un pas intuitif et ici pas nécessaire. Voir std::fseek.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par prgasp77 Voir le message
    Si mais c'est un pas intuitif et ici pas nécessaire. Voir std::fseek.
    Si ce n'est qu'un fichier, une fois qu'il est sur un disque dur, c'est un peu comme un bloc de marbre : si tu utilise fseek pour positionner le curseur d'écriture, tu va en réalité remplacer l'existant, ce qui n'est absolument pas ce que tu veux (et qui est la raison pour laquelle médinoc dit que l'on ne peut pas insérer du texte dans un fichier)

    La seule possibilité d'écriture que l'on ait après avoir positionné le curseur avec fseek est le remplacement du contenu par "quelque chose" de taille déterminée, si bien que l'on peut (éventuellement) considérer de modifier le contenu d'un fichier binaire, à la condition expresse de positionner très préciser le curseur sur le début d'une donnée et de veiller à écrire une donnée de type exactement similaire à celle d'origine.

    Si bien que, de manière générale, lorsqu'il s'agit de modifier le contenu d'un fichier, la meilleure des choses à faire est de le charger en mémoire, de modifier le contenu chargé en mémoire, puis de le réécrire. Toute tentative de faire autrement risquant de foutre un bordel incroyable dans le fichier
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Les fichiers n'ont aucune notion de lignes et de colonnes. C'est un flux. Ce que tu interprètes comme une ligne est un ensemble de caractères terminé par un '\n' ou '\r' (ou les deux).
    Dans ton code après chaque données tu envoies un saut de ligne. Or tu dois envoyer le séparateur csv (en général ';') entre chaque données d'une ligne et le saut de ligne uniquement à la fin.
    Quand une colonne est vide, tu n'envoies plus de données dans le fichier, mais tu dois quand même envoyer les séparateurs du champ.

    Voici l'algorithme, je te laisses corriger ton code en conséquence. Comme tu utilises déjà un tableau à deux dimensions, çà devrait être relativement facile.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 124
    Par défaut
    Salut à vous

    Pour résoudre ce problème j'ai donné la même taille a tout mes tableaux et j’écris en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       monFlux << tab[1][j] << " "<< tab[2][j] << endl;
    .
    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/03/2010, 11h03
  2. Ecrire dans une fichier par morceaux
    Par Sojatoad dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 09/06/2007, 19h12
  3. Ecrire dans un fichier
    Par gibet_b dans le forum Linux
    Réponses: 5
    Dernier message: 25/04/2005, 20h11
  4. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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