Pages: [1]   Go Down
Print
Author Topic: File  (Read 855 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« on: 29-09-2011, 20:17:14 »

Ho appena abbandonato il vecchio modo prendere input e stampare utilizzando per esempio System.out.println().
 
Ragazzi qualcuno di voi mi potrebbe spiegare inizialmente cortesemente come faccio a leggere e scrivere un file ? Magari scrivendomi le istruzioni da eseguire.

E poi per capire bene come funziona questo nuovo modo di leggere e scrivere potreste svolgere i seguenti banali programmini?
1.Dato un file (I.txt) contare quanti caratteri ci sono stampando il numero nel file (O.txt)
2.Dato un file di numeri (I.txt) scrivere la somma nel file (O.txt)

Vi ringrazio in anticipo  pray

PS:Ragazzi vi prego di essere chiari perchè questo argomento difficilmente mi entra in testa .Grazie Smiley
« Last Edit: 29-09-2011, 20:22:20 by Jack&Daxter » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #1 on: 29-09-2011, 20:27:52 »

Le classi comode in questi casi sono FileReader, FileWriter, BufferedReader....
Per i vari metodi e l' uso puoi consultare la documentazione Java, ti ho fatto il primo esercizio.

Code:
import java.io.*;           //devi importare la libreria per l' input e l' output
import java.util.Scanner;       //libreria che ci servirà dopo per leggere il file


public class NumeroCaratteri
{
public static void main(String [] args) throws IOException     //Non è buona norma un main che può lanciare eccezioni
{
FileReader reader=new FileReader("I.txt");                        //Creo un oggetto di tipo Reader che prende in input il mio .txt
BufferedReader buff=new BufferedReader(reader);            //Creo un oggetto BufferedReader che prende come parametro il reader precedente
PrintWriter out=new PrintWriter("O.txt");                           //Questo oggetto mi servirà per scrivere il file di output
Scanner sc = new Scanner(buff);                                      //Questa è una classe che ti tornerà molto utile, crea un oggetto scanner che prende come parametro buff, con questo oggetto
int caratteri=0;                                                                 //potrai scansionare il file di testo

while(sc.hasNext())                 //finchè c' è un prossimo carattere
{
String frase=sc.next();                 //memorizza in frase la stringa trovata dallo scanner sc
System.out.println(frase);             //Può essere omesso
caratteri+=frase.length()-1;            //incremento la variabile caratteri, basterà aggiungere la lunghezza della stringa meno uno, tolgo un numero perchè è il punto e virgola finale
}

reader.close();      //Queste istruzioni vanno messe sempre, servono a chiudere i file che hai aperto
buff.close();
out.print("Il numero di caratteri è "+caratteri);
out.close();
sc.close();
System.out.println();
System.out.println("Il numero di caratteri è "+caratteri);


}
}
« Last Edit: 29-09-2011, 21:05:17 by Daréios89 » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #2 on: 30-09-2011, 01:35:40 »

Daréios89 sei stato molto chiaro ti ringrazio   !

Ma volevo delle lucidazioni:

1)Te hai scritto:

Code:
 //incremento la variabile caratteri, basterà aggiungere la lunghezza della
stringa meno uno, tolgo un numero perchè è il punto e virgola finale

Ciò significa che nel file di lettura (I.txt) devo scrivere per esempio"1234;" e non "1234" vero?
E' buona norma utilizzare il ; ?


2)Perchè se scrivo nel file di input (I.txt) "c i a o" oppure "1 2 3 4" con lo spazio vuoto mi dice che ci sono 0 caratteri ?


3)Alcuni libri parlano di token, ma con il termine token si intendono caratteri?

4)Volevo capire se i seguenti metodi hanno il significato giusto:

hasNext() = Dice se ci sono altri caratteri
next() =Salta delimitatore(carattere di separazione, esempio lo spazio vuoto) e trova e ritorna il prossimo carattere
hasNextLine() = Verifica se c'è un'altra linea
nextLine() = Leggo linea

Non capisco a cosa serveno i metodi hasNextType e nextType   !!


PS: Sei stato molto chiaro (sto finalmente capendo qualcosa di I/O su file) e gentile ti ringrazio  pray
« Last Edit: 30-09-2011, 02:11:27 by Jack&Daxter » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #3 on: 30-09-2011, 11:15:49 »

1) Non è buona norma, diciamo che il file potrebbe avere o meno il punto e virgola, l' ho messo perchè quando  ho seguito il corso di programmazione in tutti gli esercizi c' era per complicare la vita. 

2)Emh...temo perchè si vede che Scanner utilizza lo spazio come delimitatore, cioè appena lo trova considera finita la riga, e in base a come ho scritto il codice non funziona, si dovrebbe utilizzare la classe StringTokenizer, che permette di stabilire quali delimitatori usare, cioè quali simboli costituiscono la fine della nostra riga, o lo spazio o il punto e virgola.

3)Si con token si intende un carattere.

4)next() non salta il token, semplicemente restituisce il carattere successivo. Non trovo hasNextType e l' altro su Scanner....

Purtroppo per quel problema lì bisogna smanettare un pò con StringTokenizer e lavorare sui delimitatori...
O al massimo fare un ciclo while, dove fai avanzare il buffer, tipo buff.readline() e incrementi un contatore "righe". Poi ricrei un buffer per scansionare nuovamente il file, e inserisci in un array di dimensione "righe" le stringhe e fai i conti. Non sono riuscito a farlo con StringTokenizer, mi dà alcuni problemi...
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #4 on: 02-10-2011, 19:44:36 »

Grazie Daréios89 !! Grazie a te sto finalmente capendo qualcosa ! Questo modo che ho fatto io di contare i caratteri è accettabile ? Questo codice dovrebbe gestire anche l'eventuale spazio vuoto (che non deve essere contato) e conta anche gli altri caratteri nelle successive righe  

Code:
import java.io.*;          
import java.util.Scanner;    

public class NumeroCaratteri
{
public static void main(String [] args) throws IOException  
{
FileReader reader=new FileReader("I.txt");
BufferedReader buff=new BufferedReader(reader);
PrintWriter out=new PrintWriter("O.txt");
Scanner sc=new Scanner(buff);

String x,conc="";
int i=0;

while((x=buff.readLine())!=null)
{
out.println("Riga numero : "+(i++)+" : I caratteri presenti sono:"+x);
System.out.println("Riga numero : "+i+" : I caratteri presenti sono:"+x);
conc+=x;
}

out.println("I caratteri contando anche lo spazio vuoto sono: "+conc.length());
System.out.println("I caratteri contando anche lo spazio vuoto sono: "+conc.length());

conc=conc.replaceAll(" ", "");

out.println("I caratteri escluso lo spazio vuoto sono: "+conc.length());
System.out.println("I caratteri esluso lo spazio vuoto sono: "+conc.length());

reader.close();    
buff.close();
out.close();
sc.close();

}
}

In questo modo potrei prendere la stringa conc è trasformarla,ad esempio, in un array di int/byte ecc ecc oppure fare la somma degli elementi ! E quindi utilizzando questo modo potrei fare delle modifiche/operazioni ecc con questi numeri/caratteri .
Es:
Con questo codice faccio la somma dei numeri (però numero compresi fra 0 e 9)
Code:
int somma=0;

for(int j=0;j<conc.length();j++)
somma+=Integer.parseInt(conc.substring(j,j+1));


out.println("La somma dei numeri è : "+somma);
System.out.println("La somma dei numeri è : "+somma);

E' accettabile come modo di lavorare sui file per I/O ?
« Last Edit: 02-10-2011, 20:33:11 by Jack&Daxter » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #5 on: 03-10-2011, 10:06:17 »

Ciao scusa il ritardo con cui ti rispondo, bè non vedo alcun problema, con il tempo magari imparerai a scrivere meglio e semplificare le cose, non che quello che tu abbia scritto sia sbagliato, mi sembra funzioni bene, ho visto che nel conto dei caratteri non escludi il punto e virgola, in futuro ti servirà escluderlo. Per il resto, penso non ti possa lamentare di te stesso   pray

EDIT:

Ho elaborato un' altra versione, non so come ti sembra, se è totalmente corretta, prova:

Code:
import java.io.*;
import java.util.StringTokenizer;

public class Lettura
{
public static void main(String [] args) throws IOException
{
FileReader reader=new FileReader("input.txt");
BufferedReader buff=new BufferedReader(reader);
PrintWriter out=new PrintWriter("output.txt");
int numerocaratteri=0;

while(buff.ready()){
StringTokenizer str=new StringTokenizer(buff.readLine()," ;,");
while(str.hasMoreElements()){
String tmp=str.nextToken();
System.out.println(tmp);
numerocaratteri+=tmp.length();
}
}

out.print("Il numero di caratteri è "+numerocaratteri+".");
buff.close();
out.close();

}
}
« Last Edit: 03-10-2011, 22:42:48 by Daréios89 » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Pages: [1]   Go Up
Print
Jump to: