Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420

    funzione su lettura file txt

    Ciao, a tutti...
    Sono un po' parecchio arrugginito...
    Devo scrivere una semplice funzione che legga un file di testo in questo formato:

    1|6
    2|3
    3|9

    dove il primo numero è la posizione e il secondo è un numero casuale, lo modifichi in questo modo:

    1|0
    2|0
    3|0

    La modifica però deve (più o meno..) essere fatta ciclicamente sottraendo ogni volta 1 al secondo campo fino ad ottenere tutti 0. Ho scritto questo codice:

    codice:
    $textfile = fopen("ciclo.txt", "r")
    $textfile2 = fopen("ciclonew.txt","w")
    
    while ($rigafile = fgets($textfile,1024))  {
        $campiriga = explode("|", $rigafile);
        while ($campiriga[1] <> "0")  {
            if ($campiriga[1] == "0")  {
                echo "E' già zero";
            }else{
                echo "Sottraggo 1 al $campiriga[0] campo";
                $campiriga[1] = ($campiriga[1] - 1);
                $rigafile2 = $campiriga[0] . "|" . $campiriga[1] . "\n\r";
                fwrite($textfile2, $rigafile2)
        }
    }
    fclose($textfile);
    fclose($textfile2);
    unlink("ciclo.txt");
    rename("ciclonew.txt","ciclo.txt")
    A grandi linee funziona ma quando aggiungo il rename del file impazzisce e crea disastri...
    Posso modificare in tempo reali direttamente il primo file senza doverne creare una copia? Il codice vi sembra corretto?
    Grazie a tutti...

  2. #2
    Codice PHP:
     if ($campiriga[1] == "0")  {
                echo 
    "E' già zero";
            } 
    A cosa ti serve questa parte di codice?
    Nel while entra solo quando non vale 0, quindi in quella condizione non entra mai.
    Per far uscire "E' già zero" dovresti fare in questo modo:

    Codice PHP:
    //...
    if ($campiriga[1] == "0")  {
                echo 
    "E' già zero";
          }else{
                while (
    $campiriga[1] <> "0")  {
                    echo 
    "Sottraggo 1 al $campiriga[0] campo";
                    
    $campiriga[1] = ($campiriga[1] - 1);
                    
    $rigafile2 $campiriga[0] . "|" $campiriga[1] . "\n\r";
                    
    fwrite($textfile2$rigafile2)
                }
          }
    //... 
    Per quanto riguarda il rename e la possibilita' di usare un solo file, credo si possa fare utilizzando una fopen() di questo tipo:
    Codice PHP:
    $textfile fopen("ciclo.txt""r+"
    Per maggiori informazioni sulla fopen() guarda il manuale

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Ciao, si in effetti non va bene... ho provato a semplificare troppo il meccanismo...
    In pratica sto provando ad ottenere questo funzionamento...
    La funzione inizia con il file di testo settato così:

    1|1
    2|2
    3|0
    4|0
    5|0

    e deve terminare quando tutte e 5 le righe hanno la seconda cifra uguale.
    Quello che mi occorre che faccia è:

    - partire dal primo 0 che incontra (in questo caso la terza riga);
    - fare una determinata elaborazione (che ho già pronta) e che restituisce il valore del rigo precedente (quindi 2) oppure il valore del rigo precedente +1 (quindi 3) in base ad altre condizioni;
    - passare al rigo successivo e ripetere l'elaborazione, quindi mettere 3 oppure 3+1;
    - iterare dall'inizio del file finchè non si verifica la condizione di uscita (ossia tutti valori uguali);

    codice:
    $textfile = fopen("ciclo.txt", "r")
    
    while ($rigafile = fgets($textfile,1024))  {
        $campiriga = explode("|", $rigafile);
        while [...da qui in poi non so come implementare correttamente i requisiti]
             ....
             ....
        }
    fclose($textfile);
    rename("ciclonew.txt","ciclo.txt")
    PS:toglimi una curiosità, come fai a colorare il codice?

  4. #4
    Pennarelli digitali
    Invece del tasto code, premi il tasto Php.
    Sono disponibile per realizzare lavori su commissione.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Grazie 1000...
    Sono riuscito a scrivere la funzione...
    fa tutto quello che deve fare ma alla fine entra in loop e non riesco a capire perchè...

    Codice PHP:
    $cambiamento "si";
    $livello 1;
    while (
    $cambiamento == "si")  {
        
    $textfile fopen("ciclo.txt"r);
        
    $textfile2 fopen("ciclonew.txt"w);
        while (
    $rigafile fgets($textfile,1024))   {
            
    $campiriga explode("|"$rigafile);
            if (
    $campiriga[1] < $livello)   {
                
    $campiriga[1] = chiamafunzione();
                
    $livello $campiriga[1];
                
    $cambiamento "si";
            }else{
                
    $cambiamento "no";
            }
            
    $rigafile2 $campiriga[0] . "|" $campiriga[1] . "/n/r";
            
    fwrite($textfile2$rigafile2);
        }

    La variabile cambiamento mi serve per vedere se ci sono stati aggiornamenti di valore; in tal caso ricomincio a ciclare il file, altrimenti no....
    la variabile livello settata ad 1 mi serve per far si che la funzione parta dalla terza riga del file alla prima iterazione (infatti al 3° rigo la condizione campiriga[1] < livello sarà verificata.
    Il risultato è che il file si aggiorna nella forma ad esempio

    1|4
    2|4
    3|4
    4|4
    5|4

    Ma non esce più dal ciclo andando in loop :-s

  6. #6
    Nella condizione del while dovresti mettere sia quella sia la condizione della fine del file. Altrimenti se le righe sono finite e all'ultima riga c'è stato un cambiamento allora gira a vuoto andando in loop perché la variabile non si modificherà mai in NO di nuovo.
    Sono disponibile per realizzare lavori su commissione.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Ciao, grazie per l'aiuto che mi stai dando... ho notato che il problema si verifica quando c'è una modifica all'ultima riga, ma non sono sicuro di aver capito il perchè...

    Con una modifica all'ultima riga, la variabile cambiamento diventa "si";
    ricomincia il while esterno e di conseguenza il while interno, ma la condizione dell'if ($campiriga[1] < $livello) non sarà mai verificata perchè all'ultimo cambiamento è stato impostato $livello = $campiriga[1]; quindi il flusso entra solo nel ramo else (tante volte quante sono le righe del file) e cambiamento verrà impostato sempre a "no"... quindi la volta successiva il while esterno non dovrebbe più ripetersi...

  8. #8
    Guardando bene il codice..hai messo gli fopen() in un ciclo!
    Dovrebbero aprirsi prima e chiudersi alla fine i file.
    Sono disponibile per realizzare lavori su commissione.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    420
    Uhm... non va...
    Con la funzione messa così:

    Codice PHP:
    $cambiamento "si"
    $livello 1
    $textfile fopen("ciclo.txt"r); 
    $textfile2 fopen("ciclonew.txt"w); 

    while (
    $cambiamento == "si")  { 
        while (
    $rigafile fgets($textfile,1024))   { 
            
    $campiriga explode("|"$rigafile); 
            if (
    $campiriga[1] < $livello)   { 
                
    $campiriga[1] = chiamafunzione(); 
                
    $livello $campiriga[1]; 
                
    $cambiamento "si"
            }else{ 
                
    $cambiamento "no"
            } 
            
    $rigafile2 $campiriga[0] . "|" $campiriga[1] . "/n/r"
            
    fwrite($textfile2$rigafile2); 
        } 

    Su questo file di input iniziale:

    1|1
    2|2
    3|0
    4|0
    5|0

    Ottengo questo output:

    1|1
    2|2
    3|5
    4|5
    5|5

    E in più entra in loop...
    Se invece cambio la condizione del while esterno in

    Codice PHP:
    while ($cambiamento <> "si"
    non entra più in loop ma smette di funzionare... :-s

  10. #10
    Hai detto che la funzione si deve fermare quando tutti i numeri a destra sono uguali.
    Ma quale numero devi mettere a destra? Il primo che incontri lo devi mettere a tutte le altre righe?
    Cioè chiamafunzione() che numero ci mette nella variabile?
    Prova in questo modo.
    Codice PHP:
    $cambiamento "si";  
    $livello 1;  
    $textfile2 fopen("ciclonew.txt"w);  

    while (
    $cambiamento == "si")  {  
        
    $textfile fopen("ciclo.txt"r);  
        
    $cambiamento "no";
        while (
    $rigafile fgets($textfile,1024))   {  
            
    $campiriga explode("|"$rigafile);  
            if (
    $campiriga[1] < $livello)   {  
                
    $campiriga[1] = chiamafunzione();  
                
    $livello $campiriga[1];  
                
    $cambiamento "si";  
            }
            
    $rigafile2 $campiriga[0] . "|" $campiriga[1] . "/n/r";  
            
    fwrite($textfile2$rigafile2);  
        }  
        
    fclose($textfile);
    }
    fclose($textfile2); 
    Sono disponibile per realizzare lavori su commissione.

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.