Additionner deux nombres d'un fichier txt

daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012 - 20 juil. 2007 à 20:13
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 21 juil. 2007 à 12:22
Bonjour tout le monde,

Je suis un peu déçu car je pensais avoir acquis tous les principes des File (FileReader, BufferedReader...) mais je m'aperçois que ce n'est toujours pas le cas.

L'exercice consiste à écrire dans un fichier txt des nombres aléatoire.

Ensuite, faire l'addition du premier et du dernier.

Question :

Sais-t'on lire dans un fichier txt et récupérer le premier nombre et le dernier et les additionner dans une variable ?

J'ai essayé, ça ne fonctionne pas.

Voici mon code, merci d'avance pour votre aide.

import java.io.*;
public class SommePremierDernier
{
 public static void main (String [] args) throws IOException
 {
  File f = new File("c:\\somme.txt");
  f.delete();
  
  FileWriter fw = new FileWriter(f);
  BufferedWriter bw = new BufferedWriter(fw);
  int limite = (int)(Math.random()*20+1);
  int nombres;
  int sommePremierEtDernier=0;
  
  System.out.println("limite vaut " + limite);
  
  for (int i=0; i<limite;i++)
  {
   nombres = (int)(Math.random()*20+1);
   bw.write(nombres);
   bw.newLine();
   System.out.println(nombres);
  }
  
  sommePremierEtDernier = calcul();
  
  System.out.println("sommePremierEtDernier vaut " + sommePremierEtDernier);
  
  bw.close();
  fw.close();
  
  
  
  
  
 } 
 
 public static int calcul() throws IOException
 {
  File f = new File("c:\\somme.txt");
  FileReader fr = new FileReader(f);
  BufferedReader br = new BufferedReader(fr);
  String ligne ="";
  int i=0;
  int somme=0;
  int nombre;
  
  while ((ligne=br.readLine())!=null)
  {
   nombre = Integer.parseInt(ligne);
   System.out.println(nombre);
   i++;
   System.out.println("i: "+i);
   if (i==1)
   {
    somme+=nombre;
   }
  }
  
  return somme;
 }
}

10 réponses

cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
21 juil. 2007 à 10:06
ton petit prog ca resemble un peu à : pourquoi faire simple qd on peut faire compliqué!!? ;o)

bon je voi 2 ou 3 petit soucis deja :
-la methode calcul il serait mieu de l apeller apres avoir fermer les flux d ecriture
-pourquoi tu ne feerme pas les flux de lecture?!!
-tu ecris un int et ds ta methode calcule tu lis un String  ;o) dc deja ca risk pas de marcher ;o)

si tu veux ecrire un String : bw.write(""+nombres);
ensuite ta methode calcul c est une vrai cata ;o)  je te laisse un peu reflechir ;o) pour la simplifier mechement ;o) et detoute facon tu ne mets que un seul nombre dedans... ;o)

GodConan ;o)
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
21 juil. 2007 à 10:19
Bonjour GodConan,

Merci pour ton dévouement et ta patience.

J'avais trouvé le problème d'hier soir 5 minutes avant de recevoir la confirmation de réponse à mon message sur le forum.

JE DOIS FERMER LE FLUX AVANT DE LE LIRE, autrement, il n'y a rien d'écrit, moi je le fermais après, je voyas du texte dans le txt mais je ne pouvais pas le lire.

Voilà donc une bonne chose de résolue.

Je rencontre un autre problème maintenant.

Je voudrais additionner le premier chiffre et le dernier.

Je partage le travail en deux, et je commence d'abord par additionner le premier, pour cela, j'ai créé une variable entière nommée fois que je met à 0.

Ensuite, dans mon while((ligne=bw.readLine())!=null), j'incrémente fois de 1 (fois++)

Si fois vaut 1, je transforme le String en entier avec Integer.parseInt(ligne) que j'affecte à une variable nommée par exemple enEntier.

et j'ajoute à la variable somme, la valeur de enEntier.

Mais ça marche po :)

Voici mon code que j'ai complétement retravaillé ce matin, j'ai laissé tomber la méthode pour faire tout dans le main, merci pour tout GodConan :

import java.io.*;
public class ExFile
{
 public static void main (String [] args) throws IOException
 {
  File f = new File("c:\\somme.txt");
  FileReader fr = new FileReader(f);
  BufferedReader br = new BufferedReader(fr);
  BufferedWriter bw = new BufferedWriter(new FileWriter(f));
  
  f.delete();
  
  int nbFois = (int)(Math.random()*20+1);
  int nombres = 0;
  
  System.out.println("nbFois vaut " + nbFois);
  
  for (int i=0; i<nbFois;i++)
  {
   nombres = (int) (Math.random()*20+1);
   bw.write(nombres);
   bw.newLine();
   System.out.println(nombres);   
  }
  
  bw.close();
  
  String ligne ="";
  int fois =0;
  int enEntier=0;
  int somme=0;
  
  while((ligne=br.readLine())!=null)
  {
   fois++;
   
   if(fois==1)
   {
     enEntier = Integer.parseInt(ligne);
    somme+= enEntier;
   }
  }
  
  System.out.println("fois vaut " +fois);
  System.out.println("le Premier chiffre est " + enEntier);
  
 }
}
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
21 juil. 2007 à 10:22
j'oubliais, en plus de mon message de ci-dessus, voici la copie d'écran avec l'erreur :

nbFois vaut 12
10
5
3
5
19
13
16
6
19
18
20
3
Exception in thread "main" java.lang.NumberFormatException: For input string: ""


        at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
        at java.lang.Integer.parseInt(Integer.java:489)
        at java.lang.Integer.parseInt(Integer.java:518)
        at ExFile.main(ExFile.java:39)
Press any key to continue...

Merci
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
21 juil. 2007 à 10:42
je t ai deja enumeré toute les erreur presente ds ton exemple et tu ne les as pas toute corrigé....
de plus je t ai di de reflechir à ta lecture en fait tu n a pas resolu le probleme de raisonnement ;o) tu as juste fait une obtimisation...

deja pour additionner un premier et un dernier nombre il faut etre sur que tu aura 2 element ds ton fichier *19+2

ensuite tu peux lire le premier element sans sousi ;o) et il te faut trouver le dernier ce que tu ne fait pas.... ;o)
je te fai un exemple mais pendant ce temps cherche un peu ;o)

GodConan ;o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
21 juil. 2007 à 10:45
Salut Conan,

Je viens de trouver le problème du parseInt(), il essayait de convertir des symboles en String, chose impossible.

J'ai donc transformé l'entier en String avec Integer.toString(argument) et j'ai ensuite écrit ce String.

C'est très pertinent ce que tu dis sur le fait qu'il faut au moins deux chiffres pour calculer le premier et le dernier, je fais le nécessaire dès maintenant.

Merci encore pour tout.
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
21 juil. 2007 à 10:52
je te donne une solution correspondant à ton exersise ;o)

public
static
int
calcul() throws
IOException
{
File f = new
File("c:\\somme.txt");
FileReader fr = new
FileReader(f);
BufferedReader br = new
BufferedReader(fr);
String ligne =br.readLine();

int
somme= Integer. parseInt (ligne);
String saveLine = "";
while
(ligne! =null
)
{
saveLine = ligne;
// astuce pour éviter de parser ds la boucle
ligne=br.readLine();
}
somme+= Integer.parseInt(saveLine);
return
somme;

}

dificile de faire plus simple!!!  ;o) et pas une seule alternative ;o)

GodConan ;o)
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
21 juil. 2007 à 10:57
GodConan,

Je te remercie pour le temps que tu me consacres.

Comme tu dis, ton code est simple, en plus, il est efficace.

Je vais l'analyser et le comparer avec mon code, c'est toujours intéressant de comparer les différents codes.

Je te remercie encore et j'espère que tu pourras encore m'aider dans le futur, j'ai en fait un examen de seconde session à repasser en août.

Merci pour tout
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
21 juil. 2007 à 11:03
il est prudent de faire les operation de lecture ds des block catch ;o)
note qu aucun test n est fait sur la validité des donne on supose donc que le fichier est correctement généré... ;o) ca aussi il faut s en méfier....

GodConan ;o)
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
21 juil. 2007 à 11:07
tu as raison mais le prof nous a dit qu'on ne devait pas tenir compte du fait que le visiteur entre une donnée incohérente.

le bloc catch c'est pour la gestion d'erreur ? on a pas vu cela au cours.

Je reviens tantôt

Encore merci pour ton dévouement et ta patience légendaire.
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
21 juil. 2007 à 12:22
int nombre = 0;
while ((ligne =br.readLine())!= null )
{


nombre =Integer. parseInt (saveLine);
}
somme+ = nombre;
return somme;




pour info ;o)  ca c est la soluce normale ;o) sans obtimiser l interrieur de la boucle
direction dans laquelle tu etais partie je pense ;o)
biensur tant que tu le peu il faut sortir les operation longue des boucle et un parseint c est bcp plus long qu un passage de reference ,o)

GodConan ;o)
0
Rejoignez-nous