Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    memorizzare i caratteri di un file txt

    ciao a tutti,
    ho una applicazione che mi stampa su un file.txt k matrici (grazie ancora andbin); insomma questo file è organizzato in una sorta di insieme di matrici divese da una linea vuota (il risultato di un System.out.println().
    Adesso sono nella necessità di poter leggere questo file e man a mano salvare in una struttura dati ogni matrice; e magari questa struttura dati dopo che mi salva i primi n caratteri (1 matrice), poi prende i seguenti n caratteri (2 matrice e cosi via).
    C'è un metodo di qualche classe che lavora in questo modo, ovvero tipo la funzione fscanf di c?
    Per esempio il mio file.txt adesso è:
    **************
    10
    10

    01
    10

    10
    01

    01
    01
    EOF
    ****************
    vorrei quindi avere, un array bidimensionale insomma, che prima contenga 1010; poi 0101 e così via fino a 0101.
    grazie ragazzi per l'attenzione

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    Ho un modo da proporti ma non so se ti convincono perchè presume il cambiamento del modo con il quale memorizzi la matrici all'interno del file:

    sebbebe il modo più "comprensibile" e naturale per memorizzare una matrice su di un file è quello che hai usato, potresti memorizzare gli elementi di una matrice anche lungo una riga creando proprio il vettore che ti serve. Difatti sapendo a priori le dimensioni della matrice nel tuo caso è 2x2 perchè non memorizzare nella seguente forma?
    .......
    1010
    0101
    ......
    Ad ogni riga ci sarà un vettore che rappresenta una matrice 2x2


    quando poi devi leggere il tuo file è abbstanza semplice:
    Supponiamo che sono sufficienti quattro vettori perchè ci sono quattro righe

    String[] v= new String[4]
    FileReader fileInput = new FileReader("file.txt");
    BufferedReader buf = new BufferedReader(fileInput);
    String line;
    int i=0;
    line = buf.readLine(); // legge una riga del file
    while (line != null){
    v[i]=line;
    i++;
    line = buf.readLine(); // legge la prossima riga
    }
    buf.close(); // chiude il file quando è arrivato alla fine
    }
    Il codice dovrebbe funzionare ma non ne sono sicuro cmq basta che fai qualche ricerca con la parola filereader e trovi sicuramente qualcosa di funzionante


    In questo modo la lettura ma anche la scrittura è semplice e forse ti fa risparmiare spazio.
    Non è una regola "bizzarra" altre volte mi sono capitate cose simili, l'importante è sapere qual è il modo per "comprendere" il contenuto del file nel tuo caso è sugfficinete sapere come già detto che ogni riga rappresenta una matrice 2x2
    PS i carattere EOF li hai scritti all'interno dell'esempio del post oppure fanno parte proprio del tuo file.txt?
    Ciao

  3. #3
    ciao puntino, grazie per la mano...
    allora prima ti rispondo, si la stringa EOF l'ho scritta io per indicare la fine del file.
    comunque mi sembra buona la tua idea. Ma ti voglio fare una domanda: quando il metodo readLine() legge una stringa vuota, cosa ritorna? null oppure un altra cosa. null è la fine del file o la prossima stringa vuota?
    vorrei sapere se magari è possibile invece con questa rapprensentazione del file testo
    10
    10
    //riga vuota
    01
    10
    //
    10
    01
    //
    01
    01
    //

    posso creare un array int [][] mat e che ad ogni n righe, ogni riga si riempie l'array mat; poi faccio quello che devo fare con questo array e poi provo a fare readLine() e se è vuota vuol dire che sostituisco mat con le prossime n righe fino a che una riga vuota non coincide con la fine del file? Credete si possa fare? a senso quello che vi chiedo?
    So che magari sembra molto noioso quello che vi chiedo, ma pensavo che il metodo read() o readLine() funzionassi tipo fscanf di c dove poteto leggere n caratteri diversi da \n o\r e man a mano salvarli un una struttura dati dichiarata nella stessa funzione.
    Con java si può fa?

  4. #4
    Nel caso di un array 2x2 questo codice dovrebbe andare

    codice:
    FileReader fr=new FileReader("file.txt");
    BufferedReader br=new BufferedReader(fr);
    
    int [][] mat=new int[2][2];
    int inizio=0;
    
    String s=br.readLine();
    
    while(s!=null){
    	if(s.equals("//")){
    		inizio=0;
    		s=br.readLine();}
    	else {
    		mat[inizio][0]=Integer.parseInt(s.substring(0,1));
    		mat[inizio][1]=Integer.parseInt(s.substring(1));
    		inizio=1;
    		s=br.readLine();}
    		}
    di meglio non mi veniva in mente. Come interruzione di matrice ho inserito "//" se invece tu hai proprio una riga vuota basta sostituire la condizione if con "".

    Ritorna null solo al raggiungimento della fine del file, se legge una stringa vuota ritorna una stringa vuota


    Edit: vabbè la formattazione fà pena -.-'

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    230
    puoi fare come ti ha suggerito Sodiomayor.
    Ciao

  6. #6
    grazie ragazzi per il vostro auito. Adesso però mi rendo conto di avere un'ulteriore difficoltà, cioè:
    da un file.txt dovrei poter memorizzare 3 matrici ed un vettore di dati che sono interi e/o double.
    Quindi al variare di n ed m (che chiedo dalla console all'utente) dovrei anche passare al mio programma un file.txt che dovà essere letto per poter creare le matrici di cui ha bisogno per risolvere un'equazione.
    Un esempio del file di testo è questo, n=4 righe ed m=3 colonne (uso // per commentare)
    //matrice P (nxn)
    0 0.5 0.5 0
    0 0 0.2 0.8
    0 0 0 1
    0 0 0 0.6
    //matrice Q (nxm)
    0.2 0.4 0.3
    0.5 0.6 0.7
    0.7 0.7 0.3
    0.56 0.63 0.48
    //matrice R (nxm)
    0.2 0.3 0.2
    0.6 0.78 0.56
    0.45 0.56 0.8
    0.5 0.8 0.23
    //vettore b
    1
    0.8
    0.2
    0.3
    EOF

    il codice che mi avete suggerito funziona la dove le stringhe sono solo 1 e 0, vi chiedo come posso fare per poter creare nel mio programma le 3 matrice e il vettore b dai dati del file.txt?
    sapendo a priori le loro dimensioni, faccio double [n][n] p; double [n][m] q, double [n][m] r e in fine double [n] b, come posso ogni riempire tutte queste struttura dal file di testo?
    Usando un BufferReader riesco a prendermi la stringa per ogni riga, ma come faccio poi da suddividerla nei numeri double che andranno a finire negli elementi degli array?
    Ragazzi spero di reso l'idea di quello che mi serve.
    Mi potete dare una mano? Grazie!!!

  7. #7
    Originariamente inviato da chongosnow
    grazie ragazzi per il vostro auito. Adesso però mi rendo conto di avere un'ulteriore difficoltà, cioè:
    da un file.txt dovrei poter memorizzare 3 matrici ed un vettore di dati che sono interi e/o double.
    Quindi al variare di n ed m (che chiedo dalla console all'utente) dovrei anche passare al mio programma un file.txt che dovà essere letto per poter creare le matrici di cui ha bisogno per risolvere un'equazione.
    Un esempio del file di testo è questo, n=4 righe ed m=3 colonne (uso // per commentare)

    ///////////////////

    il codice che mi avete suggerito funziona la dove le stringhe sono solo 1 e 0, vi chiedo come posso fare per poter creare nel mio programma le 3 matrice e il vettore b dai dati del file.txt?
    sapendo a priori le loro dimensioni, faccio double [n][n] p; double [n][m] q, double [n][m] r e in fine double [n] b, come posso ogni riempire tutte queste struttura dal file di testo?
    Usando un BufferReader riesco a prendermi la stringa per ogni riga, ma come faccio poi da suddividerla nei numeri double che andranno a finire negli elementi degli array?
    Ragazzi spero di reso l'idea di quello che mi serve.
    Mi potete dare una mano? Grazie!!!

    Per suddividere la stringa basta utilizzare Stringa.split(" ")
    Modificando il codice precedente

    codice:
    FileReader fr=new FileReader("file.txt");
    BufferedReader br=new BufferedReader(fr);
    
    int n=4;
    int m=3;
    
    double [][] mat=new double[n][m];
    double [] vettore=new double[n];
    int inizio=0;
    int indiceVett=0;
    
    String []riga=new String [m];
    String s=br.readLine();
    
    while(!s.startsWith("//vettore")){
    	if(s.startsWith("//")){
    		inizio=0;
    		s=br.readLine();}
    	else {
    		riga=s.split(" ");
    		for (int i=0; i<m;i++){
    
    		mat[inizio][i]=Double.parseDouble(riga[i]);
    }
    		inizio++;
    		s=br.readLine();}
    		}
    
    
    s=br.readLine();
    
    while(!s.startsWith("EOF")){
    	vettore[indiceVett]=Double.parseDouble(s);
    	indiceVett++;
    	s=br.readLine();
    	}
    fai qualche aggiustamento ed avrai quel che cerchi

  8. #8
    grazie sodiomayor per il tuo aiuto.
    controllando accuratamente il mio file.txt e sopratutto quello che ci dovrebbe essere scritto, me ne sono accorto di questo: la matrice P è nxn ed il vettore b è nx1, quindi avrò un sorgente solo con P e b e implemento il codice. Poi, siccome Q ed R sono invece nxm, avrò un altro sorgente solo con Q ed R e implemento il codice in maniera molto simile.
    Ma mi chiedo?? E' conveniente chiudere il buffer o il FileReader, o emtrambi? Come lo posso fare?
    grazie!!

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.