erlug
[Top] [All Lists]

Re: Ri:Re: [Erlug] funzione fread

To: erlug@xxxxxxxxxxxxxx
Subject: Re: Ri:Re: [Erlug] funzione fread
From: "Ivan Sergio Borgonovo" <mail@xxxxxxxxxxxxxxx>
Date: Wed, 3 Apr 2002 10:58:45 +0200
On 3 Apr 2002 at 8:41, Stefano Vedovelli wrote:

> Ciao

> > > Ciao a tutti, ho un dubbio che spero qualcuno possa chiarirmi: in C,
> > > se devo passare alla funzione fwrite, oppure fread un array di
> > > puntatori a char, come posso fare? Non so cosa metterci nel campo
> > > sizeof... Pensavo

> malloc()/calloc()?????????????

Per essere pedanti come Maurizio "rimetti a posto la candela" Lemmo :)
malloc/calloc restituiscono void... quello che gli hai passato come
parametri puoi essertelo sognato la notte :), facilmente il risultato
di sizeof...

Per essere ultra espliciti:

char* s;

//array
char[10] sarr;

//puntatore a quello che vorresti usare come array
char *pstr;

pstr = (char *)calloc(strlen(s)+1,sizeof(char)); //chi si rivede

//array di pointer a char
char* a[10];
/*
[1] di questo poi ci vorrebbe il puntatore perchè sia tipo [2]
*/

La domanda era "_come si passa a fread un array di puntatori a char_?".
Quello di sopra è un array di puntatori a char.
Quindi devi sapere il sizeof del pointer a char, cosa che malloc/calloc
NON ti dice.

sizeof(char*) non è un ovvietà... nel senso che la dimensione dei
puntatori non è standard, sipende per esempio dall'architettura e non
solo...

Probabilmente il famoso array di pointer in realtà è una roba del tipo:

char** pastr; //[2]
pastr = (char **)calloc(q,sizeof(char*)); //come è bello il C++ :))

dove q è il numero delle stringhe da ordinare...

> > > di usare queste due funzioni per leggere delle parole da file,
> > > passarle in un array di puntatori a char, ordinarle con un algoritmo
> > > di ordinamento e poi ripiazzarle sullo stesso file. Dite che è
> > > fattibile.

> > Acqua... per prenderla molto GREZZA i puntatori sono degli indirizzi
> > di memoria... il C non è il VB dove esistono i Variant e "chi coio
> > coio".

Intendevo che il dereferencing non è implicito.
Se passi il puntatore a un array di puntatori ti scrive i puntatori,
non le stringhe puntate.

> Sei hai allocato la memoria, conosci anche lo sizeof, altrimenti chissa'
> dove vai a leggere e scrivere......

Ma cosa ha allocato?

Se ha allocato spazio per l'array di puntatori...[1] o [2] scriverà con
fread _un_ array di puntatori, cosa spesso e volentieri poco utile su
un file.

Qua è il problema... a fread non si passa un array di puntatori ma al
massimo i singoli elementi dell'array di puntatori per ottenere lo
scopo che si prefigge.

A questo punto si deve essere salvato da qualche parte la lunghezza
delle stringhe puntate da ogni elemento dell'array (e il sizeof(char)
)... a meno che le stringhe non abbiano dimensione costante.

Supposto che siano ASCIIZ string non è cosa bella passarle tutte a
strlen per ricordarselo... visto che strlen si legge TUTTA la stringa
per vedere dove finisce.

E qua si pensa di scriverle su file così
string1\0string2\0string3\0

Quando le si legge la cosa è ulteriormente complicata dal fatto che la
lunghezza delle stringhe NON si conosce, a meno che a priori non si sia
fissata.


--
Salve
Ivan Sergio Borgonovo
http://www.webthatworks.it/
uniq life || sleep 24h



<Prev in Thread] Current Thread [Next in Thread>