Quand je regarde le fichier créé avec un éditeur héxadécimal, je
constate que ma chaine de caractere n'est pas enregistré, mais
seulement son adresse (je pense), car j'ai beau changer la chaine,
c'est toujour la meme chose d'enregistré. tandi que le int lui est
bien enregistré dans le fichier.
Pourrais-je avoir la bonne technique pour faire bien cette écriture ?
"Raphael Marinier" a écrit dans le message news: 3f3bc976$0$16179$
Avec ton raisonnement on ne pourrait pas faire : char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ; chaine = "pouet pouet"; NON
Richard Delorme
"Raphael Marinier" a écrit dans le message news: 3f3bc976$0$16179$
Avec ton raisonnement on ne pourrait pas faire : char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ; chaine = "pouet pouet"; NON
pourquoi non ?
char tableau[] = "hello"; // ok. "hello" est copié dans tableau. tableau = " pouet pouet"; // incorrect, tableau n'est pas un pointeur.
mais
char *chaine = "salut"; // ok. chaine = " pouet pouet"; // correct. chaine = "truc bidule machin chose"; //encore correct. chaine = tableau; // toujours ok. chaine = malloc(123); // ok.
chaine est un pointeur, et il peut changer de valeur n'importe quand. Les chaînes littérales peuvent se trouver n'importe où dans le code, pas seulement dans les initialisations.
-- Richard
"Raphael Marinier" <marinier.raphael@free.fr> a écrit dans le message
news: 3f3bc976$0$16179$626a54ce@news.free.fr...
Avec ton raisonnement on ne pourrait pas faire :
char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ;
chaine = "pouet pouet"; NON
pourquoi non ?
char tableau[] = "hello"; // ok. "hello" est copié dans tableau.
tableau = " pouet pouet"; // incorrect, tableau n'est pas un pointeur.
mais
char *chaine = "salut"; // ok.
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
chaine = tableau; // toujours ok.
chaine = malloc(123); // ok.
chaine est un pointeur, et il peut changer de valeur n'importe quand.
Les chaînes littérales peuvent se trouver n'importe où dans le code, pas
seulement dans les initialisations.
"Raphael Marinier" a écrit dans le message news: 3f3bc976$0$16179$
Avec ton raisonnement on ne pourrait pas faire : char *chaine = "pouet pouet";
char *chaine=" pouet pouet" ; OK
mais
char * chaine ; chaine = "pouet pouet"; NON
pourquoi non ?
char tableau[] = "hello"; // ok. "hello" est copié dans tableau. tableau = " pouet pouet"; // incorrect, tableau n'est pas un pointeur.
mais
char *chaine = "salut"; // ok. chaine = " pouet pouet"; // correct. chaine = "truc bidule machin chose"; //encore correct. chaine = tableau; // toujours ok. chaine = malloc(123); // ok.
chaine est un pointeur, et il peut changer de valeur n'importe quand. Les chaînes littérales peuvent se trouver n'importe où dans le code, pas seulement dans les initialisations.
-- Richard
Christophe Le Gal
In article <3f3c05c4$0$9626$, Richard Delorme wrote:
char *chaine = "salut"; // ok. chaine = " pouet pouet"; // correct. chaine = "truc bidule machin chose"; //encore correct. chaine = tableau; // toujours ok. chaine = malloc(123); // ok.
Pour en rajouter une couche : "toto"[0] = 'T' ; // ok strcpy("toto", "tutu") ; //ok strcpy("toto", chaine) ; //ok
Mais "toto" = "tutu" ; // non "toto" = chaine ; // non
enfin, j'ai pas verifie la norme, mais je ne vois pas pourquoi ca ne serait pas le cas, et en tous cas ca se passe comme ca avec gcc. "toto" est un char *, au meme titre que 1 est un int. C'est une constante char * donc. Avec une difference par rapport a 1, qui est que sa valeur correspond a l'adresse d'une zone de memoire qui contiendra les caracteres t, o, t, o, au chargement du programme.
Chez moi la compilation de strcpy("toto", "tutu"), si elle se passe sans le moindre warning, genere un programme dont l'execution provoque, on s'en doutait un peu, un Segmentation fault.
Mais je suis sur que dans le passe j'ai deja fait qqchose du genre printf("Gunaydin dunyan") ; strcpy("Gunaydin dunyan", "Hello worldn") ; printf("Gunaydin dunyan") ;
avec suivant les compilo est les plateformes des resultats differents : parfois le 2e printf affiche "Gunaydin dunyan", parfois "Hello worldn". Ca depend si le compilo est assez malin pour creer une seule fois la chaine ou non.
-- Christophe Le Gal
In article <3f3c05c4$0$9626$7a628cd7@news.club-internet.fr>,
Richard Delorme wrote:
char *chaine = "salut"; // ok.
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
chaine = tableau; // toujours ok.
chaine = malloc(123); // ok.
Pour en rajouter une couche :
"toto"[0] = 'T' ; // ok
strcpy("toto", "tutu") ; //ok
strcpy("toto", chaine) ; //ok
Mais
"toto" = "tutu" ; // non
"toto" = chaine ; // non
enfin, j'ai pas verifie la norme, mais
je ne vois pas pourquoi ca ne serait pas le cas, et en tous cas
ca se passe comme ca avec gcc.
"toto" est un char *, au meme titre que 1 est un int.
C'est une constante char * donc.
Avec une difference par rapport a 1, qui est que sa valeur
correspond a l'adresse d'une zone de memoire qui contiendra
les caracteres t, o, t, o, au chargement du programme.
Chez moi la compilation de strcpy("toto", "tutu"), si elle
se passe sans le moindre warning, genere un programme dont l'execution
provoque, on s'en doutait un peu, un Segmentation fault.
Mais je suis sur que dans le passe j'ai deja fait qqchose du genre
printf("Gunaydin dunyan") ;
strcpy("Gunaydin dunyan", "Hello worldn") ;
printf("Gunaydin dunyan") ;
avec suivant les compilo est les plateformes des resultats differents :
parfois le 2e printf affiche "Gunaydin dunyan", parfois "Hello worldn".
Ca depend si le compilo est assez malin pour creer une seule fois
la chaine ou non.
In article <3f3c05c4$0$9626$, Richard Delorme wrote:
char *chaine = "salut"; // ok. chaine = " pouet pouet"; // correct. chaine = "truc bidule machin chose"; //encore correct. chaine = tableau; // toujours ok. chaine = malloc(123); // ok.
Pour en rajouter une couche : "toto"[0] = 'T' ; // ok strcpy("toto", "tutu") ; //ok strcpy("toto", chaine) ; //ok
Mais "toto" = "tutu" ; // non "toto" = chaine ; // non
enfin, j'ai pas verifie la norme, mais je ne vois pas pourquoi ca ne serait pas le cas, et en tous cas ca se passe comme ca avec gcc. "toto" est un char *, au meme titre que 1 est un int. C'est une constante char * donc. Avec une difference par rapport a 1, qui est que sa valeur correspond a l'adresse d'une zone de memoire qui contiendra les caracteres t, o, t, o, au chargement du programme.
Chez moi la compilation de strcpy("toto", "tutu"), si elle se passe sans le moindre warning, genere un programme dont l'execution provoque, on s'en doutait un peu, un Segmentation fault.
Mais je suis sur que dans le passe j'ai deja fait qqchose du genre printf("Gunaydin dunyan") ; strcpy("Gunaydin dunyan", "Hello worldn") ; printf("Gunaydin dunyan") ;
avec suivant les compilo est les plateformes des resultats differents : parfois le 2e printf affiche "Gunaydin dunyan", parfois "Hello worldn". Ca depend si le compilo est assez malin pour creer une seule fois la chaine ou non.
-- Christophe Le Gal
Anh Vu Tran
Shamil wrote:
÷ ÐÉÓØÍÅ Thu, 14 Aug 2003 01:46:48 -0700, ztn ÎÁÐÉÓÁÌ:
Pour simplifier le truc:
TEST *t = (TEST *)malloc(sizeof(TEST));
On ne caste pas le malloc sur les compilateurs pas trop archai"ques, i.e. ceux qui reconnaissent le void *
FILE *file;
t->txt = "pouet pouet"; t->x = 257;
file = fopen("fichier_test", "rb");
file = fopen("fichier_test", "wb"); pour ouvrir en e'criture.
Pour pe^cher : t (le pointeur sur un TEST) ne contient pas la chaine pointe'e par t->txt dans le sens ou` son adresse en me'moire n'est pas dans la structure elle-me^me. t->txt est une re'fe'rence vers une chai^ne qui existe quelque part en me'moire, c'est pour cela qu'il faut appeler la fonction fwrite a` part pour la chai^ne. Il faut proce'der de me^me pour tous les pointeurs d'une structure.
Il existe un moyen de pouvoir tout e'crire d'un coup, c'est d'utiliser :
#define TAILLE_MAX 40
typedef struct{ char txt[TAILLE_MAX]; int x; }TEST;
(Les puristes vont critiquer que ce n'est pas portable) Dans ce cas, un seul appel a` fwrite suffit pour e'crire toutes les informations utiles dans le fichier puisque l'espace pour la chai^ne est re'ellement alloue' dans la structure. L'inconve'nient de cette me'thode est que l'on doit se de'finir une taille limite fixe pour la chai^ne de caracte`re.
Anh Vu
Shamil wrote:
÷ ÐÉÓØÍÅ Thu, 14 Aug 2003 01:46:48 -0700, ztn ÎÁÐÉÓÁÌ:
Pour simplifier le truc:
TEST *t = (TEST *)malloc(sizeof(TEST));
On ne caste pas le malloc sur les compilateurs pas trop
archai"ques, i.e. ceux qui reconnaissent le void *
FILE *file;
t->txt = "pouet pouet";
t->x = 257;
file = fopen("fichier_test", "rb");
file = fopen("fichier_test", "wb"); pour ouvrir en e'criture.
Pour pe^cher : t (le pointeur sur un TEST) ne contient pas
la chaine pointe'e par t->txt dans le sens ou` son adresse
en me'moire n'est pas dans la structure elle-me^me. t->txt
est une re'fe'rence vers une chai^ne qui existe quelque part
en me'moire, c'est pour cela qu'il faut appeler la fonction
fwrite a` part pour la chai^ne. Il faut proce'der de me^me pour
tous les pointeurs d'une structure.
Il existe un moyen de pouvoir tout e'crire d'un coup, c'est
d'utiliser :
#define TAILLE_MAX 40
typedef struct{
char txt[TAILLE_MAX];
int x;
}TEST;
(Les puristes vont critiquer que ce n'est pas portable)
Dans ce cas, un seul appel a` fwrite suffit pour e'crire toutes
les informations utiles dans le fichier puisque l'espace
pour la chai^ne est re'ellement alloue' dans la structure.
L'inconve'nient de cette me'thode est que l'on doit se de'finir
une taille limite fixe pour la chai^ne de caracte`re.
Pour pe^cher : t (le pointeur sur un TEST) ne contient pas la chaine pointe'e par t->txt dans le sens ou` son adresse en me'moire n'est pas dans la structure elle-me^me. t->txt est une re'fe'rence vers une chai^ne qui existe quelque part en me'moire, c'est pour cela qu'il faut appeler la fonction fwrite a` part pour la chai^ne. Il faut proce'der de me^me pour tous les pointeurs d'une structure.
Il existe un moyen de pouvoir tout e'crire d'un coup, c'est d'utiliser :
#define TAILLE_MAX 40
typedef struct{ char txt[TAILLE_MAX]; int x; }TEST;
(Les puristes vont critiquer que ce n'est pas portable) Dans ce cas, un seul appel a` fwrite suffit pour e'crire toutes les informations utiles dans le fichier puisque l'espace pour la chai^ne est re'ellement alloue' dans la structure. L'inconve'nient de cette me'thode est que l'on doit se de'finir une taille limite fixe pour la chai^ne de caracte`re.
Anh Vu
Anh Vu Tran
Anh Vu Tran wrote:
Pour pe^cher [...]
Excusez-moi pour les accents, mon mozilla a complètement déconné pour l'encodage des caractères...
Anh Vu
Anh Vu Tran wrote:
Pour pe^cher [...]
Excusez-moi pour les accents, mon mozilla a complètement
déconné pour l'encodage des caractères...