Ecrire dans un fichier

Ecrire dans un fichier - C - Programmation

Marsh Posté le 16-03-2005 à 02:20:32    

salut,
 
je voudrais faire une sorte d'history comme sous unix, c'est a dire ecrire dans un fichier tout ce que je passe en entree standard. J'ai une boucle infinie dans laquelle je mets ma fonction qui va m'ouvrir un fichier ac un open et qui va ecrire dedans ac un write mais lorsque je fais un cat sur le fichier cree il me sort n'importe quoi... A mon avis je me melange dans les parametres de open/read entre le fd renvoye par le open et l'ecriture dans le fichier a partir de l'entree standard (1) et non le fd renvoye...
 
need help! merci d'avance.


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 16-03-2005 à 02:20:32   

Reply

Marsh Posté le 16-03-2005 à 07:26:05    

tu peux aussi corriger moi si je me trompe utiliser la fonction: dup
http://www.linux-kheops.com/doc/ma [...] dup.2.html

Reply

Marsh Posté le 16-03-2005 à 08:35:41    

Tonio94 a écrit :

salut,
 
je voudrais faire une sorte d'history comme sous unix, c'est a dire ecrire dans un fichier tout ce que je passe en entree standard. J'ai une boucle infinie dans laquelle je mets ma fonction qui va m'ouvrir un fichier ac un open et qui va ecrire dedans ac un write mais lorsque je fais un cat sur le fichier cree il me sort n'importe quoi... A mon avis je me melange dans les parametres de open/read entre le fd renvoye par le open et l'ecriture dans le fichier a partir de l'entree standard (1) et non le fd renvoye...
 
need help! merci d'avance.


 
Sans source c'est difficile de bien voir le pb... mais à mon avis c'est le "write" qui te donne ça
 
Explication: Le write écrit les octets en brut dans le fichier. par exemple, si tu as "i=123" et que tu fais un "write(fd, &i, sizeof(i))" tu écriras dans le fichier la valeur décimale "123" et non, comme tu le souhaiterais je pense, les caractères '1', '2' et '3'. Ensuite, tu fais "cat fichier" et t'as n'importe quoi. En revanche, si tu fais "od -x fichier" tu retrouveras probablement tes valeurs affichées en hexadécimal.
 
Pour écrire un texte avec "write", tu dois
1) avoir un tableau de char à ta disposition, par exemple "char txt[1024]"
2) remplir ton tableau avec le texte que tu veux, par exemple "sprintf(tab, "%d\n", 123)"
3) copier ce tableau dans le fichier, par exemple "write(fd, tab, strlen(tab))"
 
Ou alors utilise "fopen" et "fprintf"...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-03-2005 à 07:11:30    

Citation :

1) avoir un tableau de char à ta disposition, par exemple "char txt[1024]"  
2) remplir ton tableau avec le texte que tu veux, par exemple "sprintf(tab, "%d\n", 123)"  


 
Tu fais ca et tu as un buffer overflow possible.
 
toujour spécifier la taille du buffer dans lequel tu va ecrire.
 
typiquement : snprintf(buffer, sizeof(buffer)-1, "format %d", argument);
 
C'est tres important.
 
Ensuite pour les fichier il n'existe pas 8467374673 methodes.
 
et bannisser les fopen et tout et tout... c du ******
 
open
close
write
read
stats
fcntl
...
 
Puis man un peut dans ta vie :)
 
?????ØÁ”„  

Reply

Marsh Posté le 17-03-2005 à 08:07:10    

plofplof a écrit :

Citation :

1) avoir un tableau de char à ta disposition, par exemple "char txt[1024]"  
2) remplir ton tableau avec le texte que tu veux, par exemple "sprintf(tab, "%d\n", 123)"  


Tu fais ca et tu as un buffer overflow possible.
 
toujour spécifier la taille du buffer dans lequel tu va ecrire.


Dans le principe, ok.

Citation :


typiquement : snprintf(buffer, sizeof(buffer)-1, "format %d", argument);


Pour une conversion numérique, il n'y a pas grand risque... La taille maximale est facilement prévisible...

Citation :


Ensuite pour les fichier il n'existe pas 8467374673 methodes.
 
et bannisser les fopen et tout et tout... c du ******
 
open
close
write
read
stats
fcntl
...


Toutes ces fonctions sont bien jolies, mais pas forcément portables ni optimisées. Il n'y a aucune raison de ne pas utiliser les fonctions standards fopen() fgets() etc.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-03-2005 à 10:48:30    

Yo,
 
Ces fonctions sont standard (SVr4, SVID, POSIX, X/OPEN et BSD  4.3.). Elle sont donc portable car elles fonctionnent sous *Nix et tout Windows en ajoutant '_' avant chaque fonction.  
 
Si char text[] explose ca donnera un stack based buffer overflow.  
Conversion ou pas c'est un automatisme a prendre.
 

Citation :


Explication: Le write écrit les octets en brut dans le fichier. par exemple, si tu as "i=123" et que tu fais un "write(fd, &i, sizeof(i))" tu écriras dans le fichier la valeur décimale "123" et non, comme tu le souhaiterais je pense, les caractères '1', '2' et '3'. Ensuite, tu fais "cat fichier" et t'as n'importe quoi. En revanche, si tu fais "od -x fichier" tu retrouveras probablement tes valeurs affichées en hexadécimal.  


 
C'est la difference entre l'ecriture en mode bytecode et byteread.
 
Le Bytecode c'est l'ecriture direct-value dans le fichier (ca donne un fichier non lisible par l'homme) (write(fd, &integer, sizeof(interger)): Ex:
 

Code :
  1. int proute;
  2. proute = 69;
  3. write(fd, &proute, sizeof(proute));


 
Le Byteread c'est l'ecriture d'une donnée en mode human-readable. A savoir :
 

Code :
  1. char saucisse[16];
  2. int saucisse_size;
  3. int proute;
  4. proute = 69;
  5. memset(saucisse, 0x00, sizeof(saucisse));
  6. saucisse_size = snprintf(saucisse, sizeof(saucisse)-1, "%d", proute);
  7. write(fd, saucisse, saucisse_size);


 
ave phun.
 
¨*%¥‰

Reply

Marsh Posté le 17-03-2005 à 11:12:56    

plofplof a écrit :


 

Code :
  1. char saucisse[16];
  2. int saucisse_size;
  3. int proute;
  4. proute = 69;
  5. memset(saucisse, 0x00, sizeof(saucisse));
  6. saucisse_size = snprintf(saucisse, sizeof(saucisse)-1, "%d", proute);
  7. write(fd, saucisse, saucisse_size);




 
Un petit

Code :
  1. fprintf(fd,"%d",proute);


ne serait-il pas plus concis ?

Reply

Marsh Posté le 17-03-2005 à 11:17:46    

man fprintf :)

Reply

Marsh Posté le 17-03-2005 à 12:58:20    

et faire un truc dans ce genre:
 
{
 
 
}

Reply

Marsh Posté le 17-03-2005 à 13:02:35    

desole je voulé effacer et g merde

Reply

Marsh Posté le 17-03-2005 à 13:02:35   

Reply

Marsh Posté le 17-03-2005 à 13:11:17    

dsls a écrit :

Un petit

Code :
  1. fprintf(fd,"%d",proute);


ne serait-il pas plus concis ?


Si fd est un File Descriptor (POSIX.1 et pas standard C), ça ne marchera pas.
 
C'est pour ça que je recommande de s'en tenir aux fonctions standards du C...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-03-2005 à 19:33:42    

Merci pour vos reponses je me replonge dedans! (avec du retard dsl)


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 30-03-2005 à 19:35:05    

En meme temps il me faudrait une fonction comme "puts" mais qui ne me mette pas de \n a la fin, quand j'utilise printf (dans mon cas) rien ne s'affiche, c'est surement pckil utilise un buffer...


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 30-03-2005 à 21:40:18    

Tonio94 a écrit :

En meme temps il me faudrait une fonction comme "puts" mais qui ne me mette pas de \n a la fin, quand j'utilise printf (dans mon cas) rien ne s'affiche, c'est surement pckil utilise un buffer...


http://mapage.noos.fr/emdel/notes.htm#fflush_stdout


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 31-03-2005 à 01:02:30    

man snprintf surtout. Bande de parano du off-by-one

Reply

Marsh Posté le 31-03-2005 à 06:03:56    

Un off-by-one ousa ??? :)
 
puis Tonio9783276 fait apres ton printf : fflush(stdout)
 
ca va flusher les buffer de IO_file dans la libc et ca va afficher ta phrase.

Reply

Marsh Posté le 31-03-2005 à 07:00:03    

ok merci all


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 31-03-2005 à 10:05:00    

relis mon message et le man de snprintf

Reply

Marsh Posté le 31-03-2005 à 15:25:25    

ok :-)


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 31-03-2005 à 18:04:03    

Tonio94 a écrit :

En meme temps il me faudrait une fonction comme "puts" mais qui ne me mette pas de \n a la fin


 
fputs

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed