Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85

    correzione esercizio modifica testo file

    codice:
    import java.io.*;
    
    import javax.swing.JFileChooser;
    import java.util.Scanner;
    
    public class TxtTrenner {
    	
    	File pathIn=null;
    	File pathOut=null;
    	FileReader reader=null;
    	Scanner inp=null;
    	PrintWriter out=null;
    		
    	public void setPathIn(){
    		pathIn=null;
    		pathOut=null;
    		reader=null;
    		inp=null;
    		out=null;
    		JFileChooser selectedFile=new JFileChooser();
    		if(JFileChooser.APPROVE_OPTION==selectedFile.showOpenDialog(null)){
    			pathIn=selectedFile.getSelectedFile();
    			System.out.println(pathIn.getPath());
    			//ora ho il percorso del file
    		}
    		else{
    			this.getIstruzioni();
    		}
    	}
    	
    	public File getPathIn(){
    		return pathIn;
    		
    	}
    	
    	public void setPathOut() throws IOException{
    		String strpathOut=pathIn.getPath().concat(" -getrennt-");
    		pathOut=new File(strpathOut);
    		pathOut.createNewFile();
    		//fino qua 0k
    	}
    	
    	public File getPathOut(){
    		return pathOut;
    	}
    	
    	public void getIstruzioni(){
    		System.out.println("Seleziona il file su cui devo operare...");
    		}
    
    	public void dividere(){
    		try {
    			reader=new FileReader(this.getPathIn());
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			System.out.println("Hai cancellato il file su cui devo operare o è corrotto...");
    			this.riprovare();
    		}
    		try {
    			out=new PrintWriter(this.getPathOut());
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			System.out.println("Non posso operare come voglio sul pc. Cambia le impostazioni di sistema e riprova.");
    			this.riprovare();
    		}
    		inp=new Scanner(reader);
    		
    		int j=15;
    		int i=0;
    		while(inp.hasNext()){
    			String daCopiare=inp.toString();
    			daCopiare=daCopiare.substring(i,j);
    			out.println(daCopiare);
    			i=j;
    			j=j+15;
    		}
    		System.out.println("Ho finito. Puoi trovare il nuovo testo in\n"+this.getPathOut());
    	}
    	
    	public void riprovare(){
    		Scanner in=new Scanner(System.in);
    		System.out.print("Scrivi 's' per riprovare: ");
    		String risp=in.next();
    		if(risp.equalsIgnoreCase("s")){
    			this.getIstruzioni();
    		}else{
    			System.out.println("Spero di essere stato utile. Arrivederci!");
    			this.closeStreams();
    		}
    	}
    	
    	public void closeStreams(){
    		inp.close();
    		out.close();
    	}
    	
    }
    io penso di sbagliare da qualche parte qua
    codice:
    		try {
    			reader=new FileReader(this.getPathIn());
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			System.out.println("Hai cancellato il file su cui devo operare o è corrotto...");
    			this.riprovare();
    		}
    		try {
    			out=new PrintWriter(this.getPathOut());
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			System.out.println("Non posso operare come voglio sul pc. Cambia le impostazioni di sistema e riprova.");
    			this.riprovare();
    		}
    		inp=new Scanner(reader);
    		
    		int j=15;
    		int i=0;
    		while(inp.hasNext()){
    			String daCopiare=inp.toString();
    			daCopiare=daCopiare.substring(i,j);
    			out.println(daCopiare);
    			i=j;
    			j=j+15;
    		}
    vorrei che il programma copi i caratteri di un file di testo a 15 a 15, finchè possibile, e li copi in pathOut (altro file)
    SO: Windows 7

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Sì, ma se non dici esattamente quale errore ottieni e dove lo ottieni (compilazione? esecuzione?) e, eventualmente, con quali input (se necessari), come pensi che ti si possa aiutare?

    Dovremmo forse copiare il codice, incollarlo, compilarlo, eseguirlo, testarlo e corregertelo?

    Questo è un forum di discussione, non un servizio di sviluppo gratuito.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    ciao.

    l'errore è di esecuzione: il file di output viene creato, ma ottengo l'errore:
    codice:
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 300 
    at java.lang.String.substring(String.java:1946) 
    at TxtTrenner.dividere(TxtTrenner.java:71) 
    at Collaudatore.main(Collaudatore.java:10)
    la riga 71 è quella dove sta substring, in dividere();.
    SO: Windows 7

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    L'errore è chiaro.
    Alla riga numero 71 del file TxtTrenner.java si verifica una StringIndexOutOfRangeException.

    Non ho copiato il codice, ma la riga 71 credo che corrisponda a questa:

    codice:
    daCopiare=daCopiare.substring(i,j);
    Da un'occhiata veloce, mi sembra l'unica plausibile che possa lanciare una tale eccezione, comunque puoi controllare.

    Il codice che hai scritto lì ha ben poco senso.
    Se leggi ogni volta una riga nuova dal file, perchè sposti ad ogni iterazione gli indici?

    codice:
    while(inp.hasNext()){
       String daCopiare=inp.toString();
       daCopiare=daCopiare.substring(i,j);
       out.println(daCopiare);
       i=j;
       j=j+15;
    }
    Cioè, la prima volta prendi la prima riga del file e ne tieni solo la sottostringa da 0 a 15. Ok.
    Per la seconda riga prendi la sottostringa che va da 15 a 30...
    Poi per la successiva riga prendi la sottostringa che va da 30 a 45...

    Ecc... ovvio che, oltre a non fare ciò che ti aspetti, prima o poi avrai degli indici completamente al di fuori di quelli validi per la stringa letta...

    Che poi, inp.toString() restituisce la rappresentazione stringa dell'oggetto Scanner... no, forse volevi usare "nextLine()"? Sarebbe sbagliato comunque il ciclo...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    quindi dovrei ottenere la lunghezza in caratteri del documento di testo e poi usarlo per il ciclo while? come si fa?

    p.s.: la riga 71 è quella che dici.
    SO: Windows 7

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da spode
    quindi dovrei ottenere la lunghezza in caratteri del documento di testo e poi usarlo per il ciclo while? come si fa?

    p.s.: la riga 71 è quella che dici.
    No, dovresti innanzitutto leggere il documento riga per riga... e questo lo si fa invocando il metodo nextLine() sull'oggetto Scanner (non il toString() che non c'entra nulla).

    Poi dovresti ripensare un'attimo alla logica ed effettuare dei test. In pseudocodice:

    codice:
    While ( ci sono ancora righe ) {
       String linea = ... // Leggo la linea
       SE ( Lunghezza(Linea) <= 15 ) {
          Prendo tutta la riga e ci faccio qualcosa
       } ALTRIMENTI {
          While( Lunghezza(Linea) > 15 ) {
             String sottostringa = ... /// Prendo i primi 15 caratteri
             ... // ci faccio qualcosa
             Linea = sottostringa dal 16° carattere in poi
          }
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    codice:
    		while(inp.hasNextLine()){
    			String daCopiare=inp.nextLine();//next è fino allo spazio (parola x parola), nextLine è fino all'a capo
    				//il problema sta nel considerare la parte scannerizzata come testo
    			if(daCopiare.length()<=15){
    				out.println(daCopiare);
    			}else{
    				while(daCopiare.length()>15){
    					out.println(daCopiare.substring(0,15));
    					out.println(daCopiare.substring(16));
    				}
    			}
    		}
    ho modificato il codice così, ma il file di output ora dà sempre la stessa stringa e si ripete all'infinito, quindi:
    codice:
    Testo
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.
    Da Wikipedia, l
    enciclopedia libera.[...]
    SO: Windows 7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.