PDA

View Full Version : c -- sono scemo?


x110
27-08-2003, 11:48
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;
}

asdalo
27-08-2003, 13:20
mmm a parte che non ho capito bene quale è lo scopo.. quindi potrei dire ca@@ate :p

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

x110
27-08-2003, 13:26
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

asdalo
27-08-2003, 13:49
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

cionci
27-08-2003, 14:51
Oppure scrivi con w+t e vedrai che i dati vengono scritti correttamente...

x110
27-08-2003, 15:03
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

cionci
27-08-2003, 15:07
Te lo consigliavo solo per vedere che scriveva tutto... Il testo lo leggi meglio ;)

x110
27-08-2003, 20:41
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

bsummer
27-08-2003, 21:46
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:old: :D quindi ci vuole qualcuno che confermi/smentisca.

Certo che se è come ricordo io, allora la questione del size torna che è un piacere (int 4 + char 2 + char 2 = 8 byte)

Aloha!

x110
27-08-2003, 22:37
ok pero' sizeof(char)restituisce 1 e non 2.
non so dovrei controllare con il famose editor esadecimale

AnonimoVeneziano
27-08-2003, 22:46
Originariamente inviato da bsummer
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:old: :D quindi ci vuole qualcuno che confermi/smentisca.

Certo che se è come ricordo io, allora la questione del size torna che è un piacere (int 4 + char 2 + char 2 = 8 byte)

Aloha!


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

cionci
28-08-2003, 07:30
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:

31------23------15------7-------0
| pad | z | pad | my |
| x 4 byte |
31------23------15------7-------0

I campi che ho chiamato pad sono stati apunto inseriti per allineare i campi lunghi un byte ai 16 bit...
E questo dovrebbe avvenire per tutti i campi di lunghezza dispari (questa ottimizzazione mi sembra che si possa disabilitare dalle opzionid el compilatore)...

x110
28-08-2003, 09:53
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

cionci
28-08-2003, 09:59
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)...

x110
28-08-2003, 10:03
ho modificato il messaggio ma tu avevi gia' risposto.....

cionci
28-08-2003, 10:07
Così leggendo il codice non ho idea perchè ti dia illegal seek...

bsummer
28-08-2003, 12:30
Originariamente inviato da AnonimoVeneziano
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

Se size(char) di dà 1 allora chiaramente sto sbagliando io...

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...:muro: , ma visto che il problema è stato risolto alla fine non è importante :D

Aloha!

x110
28-08-2003, 15:17
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.

bsummer
28-08-2003, 17:17
Originariamente inviato da x110
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.

Mi sono letto il discorso dell'unicode...ho imparato qualcosa ;)
Per quanto riguarda l'altro problema, boh :confused:, guardando il codice non mi sembra ci siano errori...

Aloha!