Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: ottavio8 - Settembre 07, 2016, 12:50:06 am

Titolo: Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 07, 2016, 12:50:06 am
Ciao a tutti,
ho il seguente problema ho dei file .dat con encoding ANSI.
Quando cerco di leggere quello che c'è dentro mi va in eccezione.

Codice: [Seleziona]
  
   ASSIGN(OP,'C:\LIC\NOMEOP.dat');
    RESET(OP);
    READ(OP,operatore);
    CLOSE(OP);

Sulla riga  READ(OP,operatore); mi da eccezione di classe RunError(100)
In questo file c'è solo il record

Codice: [Seleziona]
  TYPE
    OPERATO=RECORD
    NOME:INTEGER;
  END; 

Ho fatto anche delle prove creando e popolando il file NOMEOP.dat da lazarus e il tutto funziona perchè il file creato non ha associata nessuna encoding riesco a leggere tranquillamente il contenuto.

La mia domanda è:
Come faccio a dire in pascal che il file che sto leggendo ha l'encoding ANSI?
In modo che interpreti bene il contenuto.
Oppure come faccio a convertire il file dalla codifica ANSi a nessuna codifica?

Per vedere la codifica ho usato Notepad++
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: Stilgar - Settembre 07, 2016, 03:11:24 pm
Perdonami...
Stai cercando di leggere un "integer" come testo?

..
Prova ad usare uno stream :)

Stilgar
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: nomorelogic - Settembre 07, 2016, 03:26:21 pm
puoi allegare anche il codice lazarus con il quale crei il file .dat?
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 08, 2016, 09:29:48 am
Perdonami...
Stai cercando di leggere un "integer" come testo?

..
Prova ad usare uno stream :)

Stilgar

Ciao essendo nuovo di questo linguaggio. O meglio avendolo visto l'ultima volta nel 1991 mi manderesti un esempio di come fare la lettura con stream?
Grazie Ciao
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: Stilgar - Settembre 08, 2016, 09:39:21 am
Codice: [Seleziona]
Readln (filedati,miastringa);
Miorecord.nome :=Strtoint (miastringa);
Sto scrivendo dal cellulare bloccato in tangenziale. Il codice potrebbe non compilare 😉
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 08, 2016, 09:40:58 am
puoi allegare anche il codice lazarus con il quale crei il file .dat?

Ciao in allegato il sorgente che crea il file .dat e lo legge.
Facendolo da questo sorgente il tutto funziona perchè il file .dat aprendolo con notepad++ non ha nessuna codifica.
Mentre il file che devo leggere io viene creato da un file .pas eseguito con run file di lazarus che mette la codifica ansi al file .dat.
Ciao grazie per l'aiuto.
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 08, 2016, 10:35:36 am
Codice: [Seleziona]
Readln (filedati,miastringa);
Miorecord.nome :=Strtoint (miastringa);
Sto scrivendo dal cellulare bloccato in tangenziale. Il codice potrebbe non compilare 😉


Codice: [Seleziona]
  TYPE
    OPERATO=RECORD
    NOME:INTEGER;
  END;

 OP:FILE OF OPERATO;

Ciao ho capito cosa vuoi dire tu ma io nel file .dat ho messo un record e d il file e del tipo del record.
Grazie per l'aiuto
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: SB - Settembre 08, 2016, 10:49:05 am
L'errore 100 dice che stai leggendo oltre il limite del file.
Il programma si aspetta di trovare una sequenza di record formati da un campo di tipo intero (vedi a quanti byte corrisponde un integer per lazarus nel tuo sistema, 2 o 4?) Se nel sistema che genera il file gli interi hanno dimensioni diverse scatta l'errore...

Tra parentesi, non si assegna la codifica ad un file... Il file è una sequenza di byte che spetta a chi legge interpretare nel modo corretto
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 08, 2016, 11:16:24 am
L'errore 100 dice che stai leggendo oltre il limite del file.
Il programma si aspetta di trovare una sequenza di record formati da un campo di tipo intero (vedi a quanti byte corrisponde un integer per lazarus nel tuo sistema, 2 o 4?) Se nel sistema che genera il file gli interi hanno dimensioni diverse scatta l'errore...

Tra parentesi, non si assegna la codifica ad un file... Il file è una sequenza di byte che spetta a chi legge interpretare nel modo corretto

Ciao come faccio a vedere che da quanti byte è composto l'integer?
Il file sono stati generati su xp
MA devono essere letti da windows 7 in su.
Grazie per la dritta.
Ciao

Titolo: Re:Lettura file con Encoding ANSI
Inserito da: SB - Settembre 08, 2016, 11:31:18 am
usa SizeOf() se sei tu a scrivere il programma per entrambi i sistemi (ma in questo caso sarebbe meglio dichiarare il tipo come longint piuttosto che integer in entrambi i programmi)
Se invece leggi un file generato da altri, puoi ad esempio guardare la dimensione in byte e dividere per il numero di record (brutale, ma efficace) Nel tuo caso direi che su xp gli interi sono a 2 byte.
Se l'errore è dovuto a questo, basta che nel tuo programma cambi il tipo da integer a smallint (2 byte, se leggi file di altri) o longint (4 byte preferibile, se scrivi tu i programmi) e dovrebbe funzionare.

Purtroppo ci sono vari problemi nel passare dati da un sistema all'altro e spesso è più conveniente lavorare sulla rappresentazione testuale dei numeri piuttosto che su quella binaria.

Titolo: Re:Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 08, 2016, 11:44:42 am
Grazie mille per la dritta i programmi li scrivo io quindi posso cambiare il tipo di dato.
Infatti ho messo smallint e adesso funziona non mi da + errore RunError(100).
Seguiro i tuoi preziosi consigli.
Grazie ancora.
Ciao
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: ottavio8 - Settembre 12, 2016, 03:40:23 pm
usa SizeOf() se sei tu a scrivere il programma per entrambi i sistemi (ma in questo caso sarebbe meglio dichiarare il tipo come longint piuttosto che integer in entrambi i programmi)
Se invece leggi un file generato da altri, puoi ad esempio guardare la dimensione in byte e dividere per il numero di record (brutale, ma efficace) Nel tuo caso direi che su xp gli interi sono a 2 byte.
Se l'errore è dovuto a questo, basta che nel tuo programma cambi il tipo da integer a smallint (2 byte, se leggi file di altri) o longint (4 byte preferibile, se scrivi tu i programmi) e dovrebbe funzionare.

Purtroppo ci sono vari problemi nel passare dati da un sistema all'altro e spesso è più conveniente lavorare sulla rappresentazione testuale dei numeri piuttosto che su quella binaria.

Ciao, non ho capito bene questa tua frase:
"Se invece leggi un file generato da altri, puoi ad esempio guardare la dimensione in byte e dividere per il numero di record (brutale, ma efficace) Nel tuo caso direi che su xp gli interi sono a 2 byte."
Ho provato a dividere per 4 ma non mi ritrovo.
Allora l'intero che leggo ha dimensione 2 qual'è la divisione che dovrei fare?
Grazie ciao
Titolo: Re:Lettura file con Encoding ANSI
Inserito da: SB - Settembre 18, 2016, 09:03:05 am
Scusa il ritardo, mi era sfuggito l'intervento
Supponendo di aver memorizzato 5 interi, se la dimensione del file è 10 byte allora gli interi sono a 2 byte, se la dimensione del file è 20 byte allora gli interi sono a 4 byte.
Il file che avevi postato con 1 intero ha dimensione 2 byte