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

Entrée/Sortie Java Discussion :

Ecriture formatée dans un fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut Ecriture formatée dans un fichier
    Bonjour

    Mon langage d'origine est le Fortran, mais comme j'aimerais faire une petite application avec une interface graphique j'essaye d'apprendre la java. Pour l'instant il y a certains éléments du fortran que je ne trouve pas en java, comme par exemple pouvoir écrire dans un fichier ou dans la console en choisissant le format des données.

    Pour écrire sur la console je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(" mon texte avec " + unevariable);
    J'ai vu que pour écrire dans un fichier on pouvais faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.io.*;
    public class EcrireFichier {
    	public static void main(String[] args) {
    		System.out.println("ecriture de toto");
    		try{
    		FileWriter Monfichier = new FileWriter("toto");
    		Monfichier.write('a');
    		Monfichier.write("bcde");
    		Monfichier.close();
    		} catch (IOException e) {
    			System.out.println("erreur");
    		}		
    	}
    }
    Mon problème c'est que moi je dois écrire essentiellement des listes de nombres et le programme ne change pas de ligne à chaque write et je ne sais pas comment lui dire le format des nombres qu'il écrit, par exemple un entier sur 4 colonnes et un double avec 5 chiffres après la virgule.

    Je sais que ce sont des questions de bases, mais je me noie un peu dans tous les manuels de cours qui sont tellement nombreux et complets que je trouve rien.

    Remarque, en fortran le code serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    open(10, file="toto",action="read")
    Do i=1, n, 1
       write( 10,"(i4,F10.5)")monentier, mondouble
       !        où    format
    Enddo
    Merci pour votre aide

  2. #2
    Membre régulier Avatar de NutellaPiou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Je pense que le passage à la ligne se fait avec \n

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Monfichier.write("bcde \n");
    Et pour faire une écriture formatée, vas voir ici
    -> Mac Powa !
    -> A quoi sert IE? A télécharger Firefox !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    N'hésites pas non plus à aller voir du coté de la librairie commons-lang qui contient pas mal de fonctionnalités sur le formatage des données.
    Soyons réalistes, exigeons l'impossible !

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Attention le retour à la ligne n'est pas forcément identique sur tous les systemes
    je vous recommande plutôt l'utilisation de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String newLine = System.getProperty("line.separator");
    Monfichier.write("bcde");
    Monfichier.write(newLine);
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Merci pour vos réponses

    Pour le passage à la ligne la méthode de Alkan marche nickel et sera on ne peut plus portable.

    Pour ce qui est du format je vais regarder

  6. #6
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Je comprend pas très bien

    sous éclipse j'ai pas eu de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	System.out.printf("delta  = %10.4f", delta);
    	System.out.printf("a      = %10.4f",  a    );
    	System.out.printf("b      = %10.4f",  b    );
    Mais si dans mon terminal je fais javac maclasse.java
    il me dis que printf c'est pas pour les double ni float et il n'accepte pas le code ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	System.out.printf("delta  = %10.4f", (float) delta);
    	System.out.printf("a      = %10.4f", (float) a    );
    	System.out.printf("b      = %10.4f", (float) b    );
    Autre chose

    J'ai ce bout de codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            int npas
            ....
            npas = (int) Math.round( ( b - a ) / delta );
    	npas++;
    	System.out.printf("npas   = %10d", npas );
    et il me sort
    npas = 15011,46

    J'ai du mal à comprendre le ,46 ???? sachant que npas est un entier !

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Alkhan Voir le message
    Attention le retour à la ligne n'est pas forcément identique sur tous les systemes
    On peut également utiliser println() qui ajoutera une fin de ligne, ou "%n" avec la syntaxe à la printf()... les deux utilisant le retour à la ligne propre au système


    Citation Envoyé par Ladgalen Voir le message
    il me dis que printf c'est pas pour les double ni float et il n'accepte pas le code ci-dessous.
    Heu... C'est pas vraiment clair

    C'est une erreur de compilation ou d'exécution ? Quel est le message d'erreur exact ?


    Sinon essayes de poster un code un peu plus complet (qu'on puisse recopier et exécuter).

    a++

  8. #8
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Voilà le code en entier, c'est un code fortran que j'ai traduit en java, il y a quelques restes de fortran en commentaire.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    public class calcul {
     
    	public static void main(String[] args) {
     
    	// declaration
    	int npas;
    	// parametres
    	double hbar = 1.0, me = 1.0;
    	double delta = 0.01, a = -10.0, b = 5.0;
    	// variables fonction d'onde
    	double psi[]; // tableau allocatable
    	// calcul numerov
    	double num1, num2, denom, fnm1, fn, fnp1;
    	double E, pot;
    	// divers
    	int i,j;
    	double x;
    	// nouvelle ligne
    	// String newLine = System.getProperty("line.separator");
    	// Monfichier.write(newLine);
     
     
    	// * * * impression parametres * * * 
    	System.out.printf("delta  = %10.4f", (float) delta);
    	System.out.println();
    	System.out.printf("a      = %10.4f", (float) a    );
    	System.out.println();
    	System.out.printf("b      = %10.4f", (float) b    );
    	System.out.println();
     
    	// * * * calcul du nombre de pas * * *
    	npas = (int) Math.round( ( b - a ) / delta );
    	npas++;
    	System.out.printf("npas   = %10d", npas );
    	// allocate psi
    	psi = new double [npas]; 
     
    	// * * * fichier resultats * * *
    	// open(10,file="res")
     
    	// * * *  impression potentiel * * *
    	for (i = 0; i <= npas; i++ ) {
    		x = a + (i-1) * delta;
    		pot = 0.5 * ( x - 0.) * (x - 0.);
    		//System.out.println( x + pot(x) );
    	}
    	// write(10,"(a)")"&"
     
    	// * * * calcul numerov * * *
    	E = 1.45;
    	for (j = 1; j <= 10; j++ ) {
     
    	   E = E + 0.01;
    	   System.out.println(E);
     
    	   // * * * initialisation psi * * *
    	   for (i=0; i < npas; i++) {
    		   psi[i] = 0.0;
    	   }
    	   psi[1] = 1.0d-10;
    	   // write(10,*)x,psi(1)
    	   // write(10,*)x,psi(2)	   
     
    	   // * * *  calcul de psi * * *
    	   for ( i=2; i < npas; i++ ) {
     
    		   x = a + i * delta;
     
    //		   fnm1 = (2. * me / Math.pow(hbar,2.) ) * ( pot(x-2.d0*delta) - E );
    //		   fn   = (2. * me / Math.pow(hbar,2.) ) * ( pot( x - delta  ) - E );
    //		   fnp1 = (2. * me / Math.pow(hbar,2.) ) * ( pot(     x      ) - E );
     
    		   pot = 0.5 * ( (x-2.*delta) - 0.) * ( (x-2.*delta) - 0.);
    		   fnm1 = (2. * me / (hbar*hbar) ) * ( pot - E );
     
    		   pot = 0.5 * ( (x-delta) - 0.) * ( (x-delta) - 0.);
    		   fn   = (2. * me / (hbar*hbar) ) * ( pot - E );
     
    		   pot = 0.5 * ( x - 0.) * (x - 0.);
    		   fnp1 = (2. * me / (hbar*hbar) ) * ( pot - E );
     
    		   num1  = ( 2. + 5. * fn * (delta*delta) / 6. ) * psi[i-1];
     
    		   num2  = ( 1. - fnm1 * (delta*delta) / 12. ) * psi[i-2];
     
    		   denom = 1. - fnp1 * (delta*delta) / 12.;
     
    		   psi[i] = ( num1 - num2 ) / denom;
     
    	   }
     
    	   for (i=0; i < npas; i++) {
    		   x = a + i * delta;
    		   // System.out.println( x + psi[i]);
    	   }
     
    	  // write(10,"(a)")"&"
    	} // boucle sur j
     
    	} // fin methode
     
    } // fin classe
    En fait j'étais entrain de modifier pour pouvoir écrire dans un fichier :

    Donc j'avais ça :
    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
     
    import java.io.*;
     
    public class EcrireFichier {
    	public static void main(String[] args) {
     
    		String newLine = System.getProperty("line.separator");
     
    		System.out.println("ecriture de toto");
     
    		try{
    		FileWriter Monfichier = new FileWriter("toto");
     
    		Monfichier.write("a");
    		Monfichier.write(newLine);
    		Monfichier.write("bcde");
     
    		Monfichier.close();
    		} catch (IOException e) {
    			System.out.println("erreur");
    		}		
     
    	}
    }
    S'il y a plus simple (genre un %n) je suis preneur.

    Si vous avez des remarques diverses, étant débutant (1 journée après la lecture de java pour les enfants ....) je suis preneur aussi !

    Merci

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour commencer, en java on ne code que très peu dans le main (mais bon venant de fortran tu n'as probablement pas encore bien intégré le coté POO).

    Pour faire simple pour toi tu peux envelopper ton FileWriter dans un PrintWriter qui possède la méthode println("ma ligne") qui s'occupe de la fin de ligne automatiquement.

    Sinon pour formater les nombres tu as la classe DecimalFormat qui est utilisée à cet effet.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Déjà ton code compile parfaitement !
    Vérifies toujours la version de ton compilateur :
    Voir avec ceci si cela ne marche pas :

    et il me sort
    npas = 15011,46

    J'ai du mal à comprendre le ,46 ???? sachant que npas est un entier !
    Tu as simplement oublier un retour à la ligne : il écrit 1501 puis 1,46

    Citation Envoyé par Ladgalen Voir le message
    S'il y a plus simple (genre un %n) je suis preneur.
    Ben comme je l'ai dit : soit tu utilises println(), soit %n dans un printf()...


    a++

  11. #11
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Merci à vous il faudra que je teste tout ça !

    Effectivement je n'ai pas encore très habitué à la POO, en fortran c'est du séquentiel


    En fait je voudrais essayer de faire une petite aplli qui utilise la méthode numerov. Pour l'instant je n'ai qu'un main, je voulais vérifier si je retrouve les mêmes résultats avec java que ceux que j'avais avec fortran, d'où un main à la fortran

    A ++

  12. #12
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Bon finalement j'ai opté pour ce genre de syntaxe qui marche bien que je ne la comprenne pas complètement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(String.format("delta = %10.4f %4.2f", delta, delta ));
    En clair je converti mes double en chaine et j'imprime la chaine c'est ça ?

Discussions similaires

  1. extraction de données formatées dans un fichier excel
    Par slausseur dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/03/2007, 15h00
  2. Ecriture multiple dans un fichier Excel
    Par oregos dans le forum MATLAB
    Réponses: 6
    Dernier message: 14/03/2007, 14h50
  3. ecriture lecture dans un fichier
    Par maz dans le forum C
    Réponses: 3
    Dernier message: 19/10/2006, 11h21
  4. [C#]Ecriture/Suppression dans un fichier
    Par torNAdE dans le forum Windows Forms
    Réponses: 8
    Dernier message: 11/05/2006, 09h11
  5. Ecriture simultanée dans un fichier
    Par doudou34 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 30/09/2005, 14h26

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