Author Topic: escribir productos en txt  (Read 568 times)

ibai

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
escribir productos en txt
« on: Marzo 13, 2018, 05:53:08 pm »
Buenos dias gente estoy teniendo un problema para escribir los productos que introduzco en la sesion de mi programa, espero que al menos me puedan dar alguna pista. Les explico, el programa se basa en un menu que me permite introducir productos en un array, estos productos tienen un codigo(int), un nombre y un peso(float). Despues de introducir los productos yo podria salir de la funcion introducirProd() para ejecutar visualizarProd(), y seguir introduciendo los productos que necesite. Hasta aqui el programa me funciona perfecto.

El problema me surge en la funcion guardarProd() que lo que haria es escribir estos productos, que yo acabo de introducir en la sesion, a un txt. Necesito que el int nProd, en la funcion guardarProd(), le indique al programa el numero de elementos que hay realmente en el array, porque sino solo me escribe el primero que yo introduje. Asi que la duda es en esta funcion: guardaProd();

He intentado todo lo que se me a ocurrido, si me pueden echar una mano lo agradeceria bastante.
Un cordial saludo y gracias ante todo.

Code: [Select]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
import java.util.Scanner;



public class Main {
    static int num;       
    static Scanner sc = new Scanner(System.in);
    static Producto[] listProd= new Producto[100];
    static int nProd ;
        public static void main(String[] args) throws IOException {
           funcionSwitch();
        }   
        public static void funcionMenu(){
            do{
                System.out.println("Teclee la opción que desee." + "\n1-Introducir nuevo producto.\n2-Visualizar productos."
        + "\n3-Guardar en archivo de texto.\n4-Leer archivo de texto con productos guardados.\n5-Salir.");
                num= sc.nextInt();
            }while(num < 0 || num > 5);       
        }   
        public static void funcionSwitch() throws IOException{

            funcionMenu();

            do{
                switch(num){
                    case 1:

                       introducirProds();
                       funcionMenu();

                    break;                         
                    case 2:

                        visualizarProds();
                        funcionMenu();

                    break; 
                    case 3:
                        guardaProds();
                        funcionMenu();

                    break;
                    case 4:

                        leeProds();
                        funcionMenu();

                    break;                   
                }
            }while(num != 5);
        }     
   
   
        public static void introducirProds(){   

            int cierraWhile = 0;
                while(nProd<listProd.length && cierraWhile != 1){

                    Producto P = new Producto();

                    System.out.println("Introduzca las variables del nuevo producto.");
                    System.out.println("Código:");      P.setCodigo(sc.nextInt());
                    System.out.println("Nombre:");      P.setDescripcion(sc.next());
                    System.out.println("Peso:");        P.setPeso(sc.nextFloat());

                    System.out.println("¿Quiere dejar de introducir productos? teclee: 1 = si ,0 = no.");
                    cierraWhile = sc.nextInt();

                    listProd[nProd]= P ;           
                    nProd++;

                    if(nProd==listProd.length){
                        System.out.println("Almacenamiento lleno.");}
                }
        }    //Case 1
        public static void visualizarProds(){
            System.out.println("Productos introducidos en esta sesión: ");
                for(int i=0;i<nProd;i++)
                    System.out.println("Producto "+ listProd[i].getDescripcion() +"; con código: "
                        + listProd[i].getCodigo()+"; y peso: "+ listProd[i].getPeso()+" .");
        }   //Case 2   

        public static void guardaProds() throws IOException{
            System.out.println("Guardando los productos en: Productos.txt");
           
            File nombreFichero = new File("Productos.txt");
            FileWriter fw = new FileWriter(nombreFichero,true);       
            BufferedWriter bw = new BufferedWriter(fw);       
            PrintWriter pw = new PrintWriter(bw);
            nProd = listProd.length;
                for (int i = 0; i < nProd; i++) {                       
                       
                       
                        pw.println(listProd[i].getCodigo());
                        pw.println(listProd[i].getDescripcion());
                        pw.println(listProd[i].getPeso());
                       
                       
                            pw.close();
                    }
        }            //Case 3
        public static void leeProds(){
            System.out.println("Estoy dentro del case 4");
           
        }                                 //Case 4
   
}
Clase producto:

Code: [Select]
public class Producto {
    private int codigo;
    private String descripcion;
    private float peso;
   
   
    public Producto(int codigo, String descripcion, float peso) {
        this.codigo = codigo;
        this.descripcion = descripcion;
        this.peso = peso;
    }   
    public Producto(){
        this.codigo=0;
        this.descripcion="Desconocido";
        this.peso=0;
    }

    public int getCodigo() {
        return codigo;
    }
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public float getPeso() {
        return peso;
    }
    public void setPeso(float peso) {
        this.peso = peso;
    }
   
}

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5449
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: escribir productos en txt
« Reply #1 on: Marzo 15, 2018, 07:06:59 pm »
Hola:
No entiendo el problema. En ese método estás haciendo
Code: [Select]
nProd = listProd.length;así que ya tienes el número de elementos en el array ....
¿Cual es exactamente el problema?
Saludos.

ibai

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: escribir productos en txt
« Reply #2 on: Marzo 18, 2018, 11:05:53 pm »
Hola Chuidiang, gracias por contestar.

El problema es que solo escribe el primer producto que se introduce en la sesion. Es como si saliese del bucle for. Ademas colapsa despues de escribir el primero producto. Y la verdad que no lo entiendo, lo repaso una y otra vez y me cuadra todo para que funcione.

Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5449
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: escribir productos en txt
« Reply #3 on: Marzo 19, 2018, 03:22:02 pm »
Hola:

Estaría bien que fueras un poco más específico. "colapsa" no da mucha información. ¿Salta una excepción? ¿No hace nada? ¿Se va la memoria? ¿explota el ordenador :P ?

De todas formas, tienes un pw.close() dentro del bucle, así que escribirá el primer elemento, cerrará el fichero y dará error ( "colapsa" :) ) cuando intente escribir el segundo elemento. Debería saltar una excepción IOException o similar.

Saludos.

ibai

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: escribir productos en txt
« Reply #4 on: Marzo 19, 2018, 07:16:45 pm »
jajajaja perdona, es que no llevo mucho tiempo programando. Con colapsa me refiero a eso mismo que dices, salta una excepcion: Exception in thread "main" java.lang.NullPointerException, en la funcion guardaProd().

Si saco pw.close() del for, no escribe nada. Al principio lo puse por afuera, pero alguien que sabia mas que yo me lo corrigio y me lo puso dentro del for.
Tambien he intentado definir nProd de una forma distinta:
Code: [Select]
for (int nProd = 0; nProd < listProd.lenght; nProd++) {
                                               
          pw.println(listProd[nProd].getCodigo());
          pw.close();
}
Es decr, en vez de poner "i" < nProd, defino el propio nProd dentro del for. Pero me pide que le cambie el nombre a la variable nProd.

Un saludo y muchas gracias
« Last Edit: Marzo 19, 2018, 07:22:16 pm by ibai »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5449
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: escribir productos en txt
« Reply #5 on: Marzo 19, 2018, 11:00:45 pm »
Hola:

He revisado por encima. Ahí van varias cosas para que tengas en cuenta

Lo del NullPointer. Tu listaProd es un array de 100. listaProd.length es 100 siempre (es el tamaño del array). Cuando creas el array, se crea un array con 100 null dentro y su longitud es 100. Según vas añadiendo productos, tienes la variable nProd para guardar el índice del array que toca y metiéndolo dentro del array. Cuando nProd vale, por ejemplo, 10, tienes 10 productos en listaProd y 90 null detrás (total 100).

Cuando haces el bucle para guardar, debes hacerlo sobre el número real de productos (nProd), no sobre listaProd.length. Si lo haces así, el elemento 11 (en el ejemplo de antes) te dará nullpointerexception cuando hagas pw.println(listProd[ i ].getCodigo()); ya que listProd[ i ] es null y la llamada null.getCodigo() da NullPointerException. Así que haz el bucle de 0 a nProd .... pero NO alternes el valor de nProd. Justo antes del bucle estás haciendo nProd=listaProd.length, por lo que nProd valdrá 100 y solo tienes 10 elementos.

y el close debe estar inmediatamente fuera del bucle, si no, en la segunda iteración, el fichero está cerrado y dará un error. Si no escribe nada, llama al método flush() de BufferedWriter para obligar a la escritura en fichero. pero el close fuera del bucle debería bastar, así que si no escribe nada, igual hay otro problema en otro sitio.

Saludos.

ibai

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
Re: escribir productos en txt
« Reply #6 on: Marzo 19, 2018, 11:49:13 pm »
Madre mia... ya esta funciona perfecto. Muchas gracias la verdad una explicacion completa, yo pensaba que el array estaba vacio incluso.
Entonces asi es como quedaria la funcion para que el programa no de error:
Code: [Select]
public static void guardaProds() throws IOException{
            System.out.println("Guardando los productos en: Productos.txt");
    try{       
            File nombreFichero = new File("Productos.txt");
            FileWriter fw = new FileWriter(nombreFichero,true);       
            BufferedWriter bw = new BufferedWriter(fw);       
            PrintWriter pw = new PrintWriter(bw);
           
                for (int i = 0; i < nProd; i++) {
                       
                        pw.println(listProd[i].getCodigo());
                        pw.println(listProd[i].getDescripcion());
                        pw.println(listProd[i].getPeso());
                       
                 }pw.close();
        }catch(IOException e){
        System.out.println("No se ha podido guardar. Error:"+ e);}       
        }
ahora seguire a ver si termino ya este programita y continuo aprendiendo java. Un saludo y muchisimas gracias ;D ;D

 

ey