' Rapid-Q by William Yu (c)1999-2000 . ' ================================================================================ ' Upload_il_tuo_script_su_Rapidq.it ' Come_gestire_i_file_di_testo_ Un file di testo è solo una serie di caratteri ASCII immagazzinati sul disco. La maggior parte dei caratteri rappresentano l'informazione attuale di testo, quali letter ( A, b, c, D ), numeri ( 1, 2, 8675309 ), e punteggiatura punctuation ( !, ., :, , ). Alcuni caratteri rappresentano degli speciali comandi di formattazione, quelli più usati sono i codice ASCII 013 ( CR, o carriage return ritorno a capo) e 010 ( LF, o line feed o avanzamento di linea). Tali codici insieme, CR + LF, sono noti come interruttori di linea e sono quelli che dicono al computer di andare a capo durante il testo: Hello.[CR,LF]How are you doing today?[CR,LF]1 + 1 = 2 viene mostrato in questo modo: Hello. How are you doing today? 1 + 1 = 2 Noi abbiamo imparato presto a mettere insieme le parole per formare frasi e contenere diverse frasi in paragrafi, quindi ci sono poche persone che parlano continuamente come un unico flusso di parole senza interruzzioni dall'inizio alla fine. Allo stesso modo possiamo dire con sicurezza che il modo migliore di trattare con i file di testo è lavorare con intere stringhe di caratteri da una interruzione di linea alla successiva. ReadLine Il metodo READLINE del componente QFileStream legge tutti i caratteri dalla posizione corrente del file fino alla prossa interruzione di linea e ritorna i dati in una variabile stringa. DIM InputLine AS STRING DIM File AS QFILESTREAM File.OPEN ( "TEST.TXT", 0 ) ' 0 = read only InputLine = File.READLINE Il codice suesposto apre un file esistente di nome "TEST.TXT" e legge una intera linea di testo, passa il testo alla variabile stringa INPUTLINE. WriteLine Il metodo WRITELINE del componente QFileStream scrive una stringa di caratteri in un file partendo dalla posizione corrente del puntatore del file ponendo alla fine della stringa una interruzione con i codici CR + LF . DIM File AS QFILESTREAM File.OPEN ( "TEST.TXT", 1 ) ' 1 = write only File.WRITELINE ( "This is a test!" ) Il codice suesposto apre un file chiamato "TEST.TXT" e scrive la stringa "This is a test!" in esso . Cambiare il testo esistenteRicordarsi sempre che persino un file di testo che contiene una lista di nomi appaia sullo schermo in tale modo: John Chris Steve Billy In realtà è scritto su disco in questo modo: John__Chris__Steve__Billy Dove il carattere sottolineato ( __ ) rappresenta una interruzione della linea di codice mediante CR +LF. Supponiamo che abbiamo bisogno di cambiare il nome "Chris" in "Christopher". Se abbiamo fatto un cambio diretto del file originale: DIM InputLine AS STRING DIM File AS QFILESTREAM File.OPEN ( "NAMES.TXT", 2 ) ' 2 = read and/or write InputLine = File.READLINE ' reads John and moves position up File.WRITELINE ( "Christopher" ) ' writes new name over "Chris" File.Close Il file su disco sarebbe cambiato in questo modo: John__Christopher___Billy La parte aggiunta "topher" insieme all'interruzione di linea CR +LF al centro del file effettivamente ha sovrascritto il successivo nome "Steve" e l'interruzione di linea successiva. Questo causa la perdita di informazione "Steve" dal file di testo, che appare a video in questo modo: John Christopher Billy o addirittura così: John Christopher Billy se il codice LF forza il video a mostrare un secondo avanzamento di linea, lasciando una linea vuota dove era prima mostrato "Steve". Se un file di testo deve essere cambiato da un tuo programma, è meglio usare un file temporaneo di lavoro dove mantenere il nuovo risultato. In questo modo ci sono meno possibilità di sovrascrivere una parte della successiva linea di testo. DIM NameFile AS QFILESTREAM DIM TempFile AS QFILESTREAM DIM InLine AS STRING ' open original file NameFile.OPEN( "NAMES.TXT", 0 ) ' Input only ' create a new temp file TempFile.OPEN( "NAMES.TMP", 65535 ) ' Create new file TempFile.CLOSE ' open tempfile for output only TempFile.OPEN( "NAMES.TMP", 1 ) ' Output only ' loop through original file DO ' read file line by line InLine = NameFile.ReadLine ' check for string to be replaced IF InLine = "Chris" THEN ' replace string in temp file TempFile.WRITELINE ( "Christopher" ) ELSE ' just output the unchanged line TempFile.WRITELINE ( InLine ) END IF ' Marker > 0 LOOP UNTIL NameFile.EOF ' close both files NameFile.CLOSE TempFile.CLOSE ' replace old file with new file KILL "NAMES.TXT" RENAME "NAMES.TMP", "NAMES.TXT" Il codice suesposto legge le informazioni presenti in "NAMES.TXT": John__Chris__Steve__Billy e cambia in maniera appropriata il file, come mostrato sotto: John__Christopher__Steve__Billy ' =============================================================================== ' 2003 Holyguard.net - 2007_Abruzzoweb