Newsgroup: it.comp.lang.visual-basic
Titolo: "vera" EOF

vorrei leggere sequenzialmente un file .log generato da un gioco, tramite
Open "file" for Input as ...
While Not EOF(...)
Line Input # ..., stringa
ecc ecc
il problema è che spesso e volentieri vengono inseriti nel file log del 
caratteri non stampabili, tipo
stringa = "ScriptLog: MOTD2:   ?ÿBesucht " ................
(i puntini indicano che la riga di dati è in realtà molto più lunga, ma la 
lettura della stringa si interrompe prima, a significare che dopo viene 
vista la fine del file e i dati successivi vengono ignorati)
che, non so come non so perché, vengono letti come fine del file, per cui la 
lettura si interrompe, magari dopo poche righe
come posso "forzare" il codice a leggere "VERAMENTE" tutto il file?

 stringa = "ScriptLog: MOTD2:   ?ÿBesucht " ................
F1 -> Open
hint: Binary
hth,
Lokar



con le API:
_________________________________________
Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA"
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal
dwShareMode As Long, _
  lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long,
ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As
Long
 Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long,
lpBuffer As Any, ByVal nNumberOfBytesToRead As Long,
lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
 Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As
Long) As Long
Din  retval  as Long
Fl& = FileLen("SYM.SRC")
BuffSym = Space(Fl&) 	' make room in the buffer
hFile = CreateFile("SYM.SRC", GENERIC_READ, FILE_SHARE_READ, ByVal
CLng(0), OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
retval = ReadFile(hFile, ByVal BuffSym, Fl&, numread, ByVal CLng(0))
retval = CloseHandle(hFile)    'CHIUDI IL FILE 
_________________________
--
ciao
  Stefano


mi stai dicendo di aprire il file in binario?
il file è un file di testo grandino (anche 800 Kbytes) e viene letto molte 
volte al minuto da programma principale, alla ricerca di determinati 
accadimenti...
immagazzinando la singola riga in una variabile stringa ed usando delle 
INSTR la cosa è rapidissima, in binario la cosa mi lascia alquanto 
perplesso...


Se il file contiene caratteri non stampabili (ASCII 0 specialmente), allora non
lo puoi considerare un file di testo, quindi scordati il line input.
Puoi sempre caricare in una stringa tutto contenuto del file aperto for binary,
con Split trasformarlo in un array di stringhe corrispondenti alle righe e poi
passartelo con un ciclo for.
Se non ti piace avere un'unica Get, leggi il file a blocchi di 4k, ad esempio.
Se poi il file è un log che viene "esteso" man mano dall'altra applicazione,
puoi sempre fare in modo che il tuo prg si "ricordi" dov'era arrivato a leggere
all'iterazione precedente ed alla successiva ripartire da lì.
Bye
Raf

INSTR la cosa č rapidissima,
Se usi l' API ReadFile, come ti avevo consigliato, la cosa č molto piů rapida
che con la gestione di VB, e ti ritrovi tutto il file in una stringa.
--
ciao
  Stefano

  Stefano 


va bé, farò un pò di prove.... vi saprò dire 

 ha scritto

msdn, tipi di variabili:
Esistono due tipi di stringa:
Stringhe di lunghezza variabile, che possono contenere fino a circa 2 
miliardi (2^31) di caratteri.
Stringhe di lunghezza fissa, che possono contenere da 1 a circa 64 KB (2^16) 
di caratteri.
Nota   Una stringa di lunghezza fissa di tipoPublic non puň essere 
utilizzata in unmodulo di classe.
I codici per i caratteriString sono compresi fra 0 e 255. I primi 128 
caratteri (0-127) del set di caratteri corrispondono alle lettere e ai 
simboli di una tastiera standard americana. Questi primi 128 caratteri sono 
gli stessi definiti dal set di caratteriASCII. I successivi 128 caratteri 
(128-255) sono caratteri speciali, quali lettere di alfabeti internazionali, 
accenti, simboli di valuta e frazioni.Ilcarattere di dichiarazione del tipo 
per String č il simbolo del dollaro ($).
ciao, a. 

 dopo ore di gioco arriva quasi al mega........
Un mega lo tiri su tranquillamente (anche se in realtà in memoria i mega 
sono 2 dato che vb lavora in unicode).
Una
miastringa = Space$(Lof(#1))
Get #1, 0, miastringa
ti tira su tutto in una stringa senza nessuna funzione API (magari ci mette 
qualche millisecondo in più).
Certo leggendo a blocchi e cercando per il separatore di linea sarebbe 
preferibile anche se più complesso.
Ciao 

dopo ore di gioco arriva quasi al mega........
Come ti ha detto Andrea la lunghezza delle stringhe può arrivare fino a
2.147.483.648 caratteri.
Io ho usato quel sistema anche per elaborare del file di log di comunicazione
che arrivavano a diversi Mbytes senza alcun problema.
--
ciao
  Stefano

 (2^16) di caratteri.
opppsssss, vecchio rimbambito che non sono altro... ero rimasto ai 64 KB dei 
tempi andati
bene, con il semplice codice
Lunghezza = FileLen(File) - OldBuffer        'OldBuffer posto inizialmente a 
1
Stringa = String(Lunghezza, " ")
NumFile = FreeFile
Open File For Binary As NumFile
   Get #NumFile, OldBuffer, Stringa
Close (NumFile)
OldBuffer = Lunghezza
non solo mi leggo l' intero file in una stringa e poi con pochi INSTR mi 
cerco quello che ho da cercare, ma la volta successiva (nel frattempo il 
file si allunga) inizio a leggere solo da dove ero arrivato in poi..... 
meglio di prima
ok, grazie a tutti 

 (2^16) di caratteri.
