Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [java]leggere file

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    21

    [java]leggere file

    Ho necessità di leggere un file scritto in esadecimale e del quale ho bisogno di esaminare carattere per carattere o perlomeno riuscire a posizionarmi a determinate posizioni.
    Ho provato nel seguente modo ma sicuramente sbaglio.....
    FileReader fr ;

    String tmp1= PathInput + name;
    String s = new String();
    String scmd = new String();

    try {fr=new FileReader(tmp1);}
    catch (IOException ed) {fr=null;};


    BufferedReader br = new BufferedReader(fr);

    do
    {
    //try {s=br.readLine();
    try {numletti=br.read(cbuf,1,10);
    if (numletti==0)
    {
    break;
    }
    else
    {

    System.out.println("LEGGO " + cbuf);
    }
    } catch (IOException ea){System.out.println("ERRORE");};

    }while(s != 0);
    return true;
    }
    Non riesco nenache a dichiarare cbuf in modo corretto.
    Aiuto!!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Non ho ben capito cosa intendi fare, se leggere il contenuto del file, o cos'altro...
    Penso che tu voglia leggere il contenuto del file, quindi c'eri quasi, solo che hai fatto molte operazioni in più inutili:
    codice:
    FileReader fr;
    BufferedReader br;
    String tmp1= PathInput + name; 
    String s = null; 
    String scmd = null; 
    
    try {
       fr = new FileReader(tmp1);
       br = new BufferedReader(fr);
       do {
          s = br.readLine()   // in s hai il contenuto della prima linea
          if (s != null) {
             System.out.println("Ho letto: " + s);
          } else {
             System.out.println("FINE DEL FILE");
          }
       } while (s != null);
    } catch (Exception e) { e.printStackTrace(); }
    Innanzitutto ti consiglio di usare solamente un blocco try/catch, così se accade un'eccezione in qualsiasi parte del codice la catturi, senza bisogno di differenziare così tanto il punto (il compilatore, infatti, ti dice esattamente la riga in cui si è verificata l'eccezione).

    Tu devi esaminare ogni riga, carattere per carattere. Quindi puoi procedere in questo modo:
    codice:
    do {
       s = br.readLine();
       if (s != null) {
          for (int i=0; i<s.length(); i++) {
             System.out.println("Carattere numero " + i + ": " + s.charAt(i) );
          }
       }
       ...
    } while (s != null);
    Il fatto che tu legga delle stringhe che rappresentano dei numeri in base 16 penso che ti serva per poterle trattare come numeri. In questo caso, la classe Integer ti mette a disposizione il metodo parseInt() che può parsare anche stringhe di numeri in base diversa dalla 10:
    codice:
    String mioNumero = "B902";
    System.out.println("Valore decimale: " + Integer.parseInt(mioNumero, 16) );
    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
    Registrato dal
    Jun 2004
    Messaggi
    21
    Grazie dell'aiuto con il quale sono andato più avanti, ma ora ho difficoltà ad utilizzare "read", ossia devo leggere un certo numero di caratteri alla volta posizionandomi in detgerminate posizioni (ho provato skip ed è ideale).
    Soprattutto non riesco a dichiarare e quindi ad utilizzare cbuf della
    read(cbuf,int,int).
    Grazie!!!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Se vuoi utilizzare la versione di read che prende i tre parametri:
    codice:
    int read(char[] cbuf, int offset, int length);
    Puoi procedere così:
    codice:
    int num = 0;
    int quanti = 10;   // Così leggo 10 caratteri alla volta;
    int offset = 0;
    char [] cbuf = new char[quanti];
    do {
       ...
       num = br.read(cbuf, offset, quanti);   // Leggo 'quanti' caratteri a partire da 'offset' e li memorizzo in 'cbuf'
       offset += num;   // Incremento l'offset.
       for (int i=0; i<cbuf.length; i++)
          System.out.println(cbuf[i]);
       ...
    } while (num > -1);
    In questo modo, ciascun carattere letto viene salvato in un elemento dell'array di caratteri cbuf.


    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
    Registrato dal
    Jun 2004
    Messaggi
    21
    Indicazioni perfette , ma è possibile che ciclando nelle letture quello che loggo si accoda (nel buffer) a quello letto precedentemente?
    O più precisamente come faccio a pulire il buffer?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Secondo il codice che ti ho dato non dovrebbe accodarsi il nuovo input, al vecchio, ma sovrascriverlo ad ogni lettura (tranne, forse, la lettura finale), dato che il buffer ha la stessa dimensione dell'input. Se vuoi evitare problemi di accodamento, basta che tu ricostruisca ad ogni ciclo il buffer:
    codice:
    int num = 0;
    int quanti = 10;   // Così leggo 10 caratteri alla volta;
    int offset = 0;
    char [] cbuf;
    do {
       ...
       cbuf = new char[quanti];
       num = br.read(cbuf, offset, quanti);   // Leggo 'quanti' caratteri a partire da 'offset' e li memorizzo in 'cbuf'
       offset += num;   // Incremento l'offset.
       for (int i=0; i<cbuf.length; i++)
          System.out.println(cbuf[i]);
       ...
    } while (num > -1);
    La linea in grassetto ricostruisce il buffer prima di utilizzarlo. In questo modo hai sempre un buffer pulito.

    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

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.