|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
c -- sono scemo?
non mi scrive la struttura... perche'?
anzi mi scrive This buffer contains 34 charactersd struct STRU{ int x; char my; char z; }; #include <stdio.h> int main () { FILE * pFile; struct STRU mys; mys.x =100; mys.my='a'; mys.z ='c'; char buffer[] = "This buffer contains 34 characters"; pFile = fopen ("myfile.txt" , "w+b"); fwrite (buffer , 1 , 34 , pFile); fwrite (&mys , 1, sizeof(mys) , pFile); fclose (pFile); return 0; } |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Aug 2003
Città: Firenze
Messaggi: 9
|
mmm a parte che non ho capito bene quale è lo scopo.. quindi potrei dire ca@@ate
nel tuo codice esegui due fwrite, la prima : fwrite (buffer , 1 , 34 , pFile); scrive esattamente il contenuto di buffer, cioè "This buffer contains 34 characters" la seconda fwrite (&mys , 1, sizeof(mys) , pFile); scrive nel file la struttura mys. Per farti un esempio, mys.x che tu imposti a 100 corrisponde infatti alla "d", quel carattere che vedi in fondo: This buffer contains 34 charactersd quindi... funziona, ammesso che dovesse fare questo :P |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
ok ma mi dovrebbe scrivere anche la 'a' e l'altra lettera.
vengo dal vb e gia' qua si spiega tutto, vorrei scrivere delle strutture miste a stringhe riposizionandomi con fseek, ma non ci riesco e non capisco perche'. grazie |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Aug 2003
Città: Firenze
Messaggi: 9
|
Aprendo il file con un editor esadecimale vedo che ci è stato scritto una cosa così:
This buffer contains 34 charactersd ac Ricordati che stai scrivendo strutture con tipi misti, quindi non lo puoi leggere sempre correttamente con editor di testo Se vuoi fare una verifica veloce, scrivi solo la struttura e poi con una fread rileggila, vedrai che è tutto ok Probabilmente è solo un problema di visualizzazione di notepad, o del progamma che stai usando, prova ad usare un editor esadecimale e vedrai carattere per carattere cosa c'è nel file |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Oppure scrivi con w+t e vedrai che i dati vengono scritti correttamente...
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
hai propio ragione, e' colpa di kwrite.
ero abituado ad usare notepad che qualcosa scrive. ciao cionci. il t e' testo e mi crea qualche problema,,in quanto dovrebbe scrivere il il valore 100 come "100" 3 byte se e' cosi' preferisco lasciar perdere. comunque grazie |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Te lo consigliavo solo per vedere che scriveva tutto... Il testo lo leggi meglio
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
no no son propio scemo.....
cioe' non capisco perche' la struttura e' lunga 8 e i singoli campi valgono 6. int 4 char 1 char 1 in piu' al secondo perror mi dice illegal seek. perche'???? struct STRU{ char my; char z; int x; }; #include <stdio.h> int main () { FILE * pFile; int *pstru; int w; struct STRU mys; pstru=mys.my; mys.my='a'; mys.x =100; mys.z ='c'; char buffer[] = "This buffer contains 34 characters"; pFile = fopen ("/myfile.txt" , "w+b"); fwrite (buffer , 1 , 34 , pFile); perror("ciao1"); w=fwrite (&mys , 1,sizeof(mys),pFile); perror("ciao2"); printf("sizeof(mys)= %d \nsizeof(mys.my)= %d \nsizeof(mys.z)= %d \nsizeof(mys.x)= %d\nw = %d\n",sizeof(mys),sizeof(mys.my),sizeof(mys.z),sizeof(mys.x),w); fclose (pFile); return 0; } questo e' l'output ciao1: Success ciao2 Illegal seek sizeof(mys)=8 sizeof(mys.my)=1 sizeof(mys.z)=1 sizeof(mys.x)=4 w=8 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Mi sembra di ricordare che il tipo char è a 16 bit.
Ad esempio quando scrivi char a; a='\n'; Quel '\n" ti dice che la stringa è finita e di andare a capo, cioè è formato da due codici ascii, rispettivamente il 13 (carriage return) e il 10 (line feed). Questo sotto windows/dos, perchè sotto linux c'è solo il 13 (mi pare). Ma la mia memoria non è più quella di una volta Certo che se è come ricordo io, allora la questione del size torna che è un piacere (int 4 + char 2 + char 2 = 8 byte) Aloha!
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
ok pero' sizeof(char)restituisce 1 e non 2.
non so dovrei controllare con il famose editor esadecimale |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Char non è a 8bit ? Mi sembra possa essere usato anke per interi dal -128 a 127 (ovvero 256 di range massimo che è un numero a 8 bit ) Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La somma dei vari campi è 6 byte...
4 byte per l'int e 1 byte per ogni char... sizeof(mys) potrebbe anche essere giusto 8...infatti quando si va ad operare su una struttura si preferisce effettuare un allineamento ai 16 bit... Accedere singolarmente ad un campo di memoria dispari è un'operazione storicamente poco agevole per le CPU x86... Per questo i compilatori effettuano un allineamento delle strutture ai 16 bit... Probabilmente la struttura in memoria sarà memoriazzata in questo modo: Codice:
31------23------15------7-------0 | pad | z | pad | my | | x 4 byte | 31------23------15------7-------0 E questo dovrebbe avvenire per tutti i campi di lunghezza dispari (questa ottimizzazione mi sembra che si possa disabilitare dalle opzionid el compilatore)... |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
cionci sei grande.
quando parli hai la soluzione. infatto l'ho provato a compilare in windows con un'altro compilatore e non e' successo. per tua informativa, sappi che pero' i pad mi sono stati aggiunti alla fine del file. (61)=a (63)=c ( 04 08 64 00)=100 (00 00)=pad sai mica qual'e' impostazione per il compilatore? perche' sto usando kdevelop e l'unica impostazione che e' settata e' wall in piu' perche mi dice illegal seek sulla seconda write? ciao Ultima modifica di x110 : 28-08-2003 alle 11:00. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì ? Allora allinea direttamente la struttura ai 32 bit...
No, mi dispiace... Non me lo ricordo... Prova a compilare con l'impostazione -O0 (O come Otranto Zero)... |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
ho modificato il messaggio ma tu avevi gia' risposto.....
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Così leggendo il codice non ho idea perchè ti dia illegal seek...
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Quote:
Tuttavia continuo a ricordare che c'è un linguaggio in cui il char è definito a 16 bit...appurato che C non è, pascal e Vb sono sicuro di no, cosa rimane? Boh... Aloha!
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2002
Città: Massa Carrara
Messaggi: 589
|
in realta' c'e' acora qualche problema
rileggi per favore. il vb quando si parla di stringe generalmente le indica come unicode e un carattere occupa 2 byte. ciao...... grazie. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Quote:
Per quanto riguarda l'altro problema, boh Aloha!
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:11.



















