Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1943 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Ecrire dans un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire dans un fichier

n°1014129
Tonio94
Posté le 16-03-2005 à 02:20:32  profilanswer
 

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 z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
mood
Publicité
Posté le 16-03-2005 à 02:20:32  profilanswer
 

n°1014134
celestin14​09
Posté le 16-03-2005 à 07:26:05  profilanswer
 

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

n°1014149
Sve@r
Posté le 16-03-2005 à 08:35:41  profilanswer
 

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.
n°1015561
plofplof
Posté le 17-03-2005 à 07:11:30  profilanswer
 

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 :)
 
?????ØÁ”„  

n°1015570
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2005 à 08:07:10  profilanswer
 

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/
n°1015686
plofplof
Posté le 17-03-2005 à 10:48:30  profilanswer
 

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.
 
¨*%¥‰

n°1015730
dsls
Posté le 17-03-2005 à 11:12:56  profilanswer
 

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 ?

n°1015734
plofplof
Posté le 17-03-2005 à 11:17:46  profilanswer
 

man fprintf :)

n°1015881
celestin14​09
Posté le 17-03-2005 à 12:58:20  profilanswer
 

et faire un truc dans ce genre:
 
{
 
 
}

n°1015883
celestin14​09
Posté le 17-03-2005 à 13:02:35  profilanswer
 

desole je voulé effacer et g merde

mood
Publicité
Posté le 17-03-2005 à 13:02:35  profilanswer
 

n°1015890
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2005 à 13:11:17  profilanswer
 

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/
n°1030268
Tonio94
Posté le 30-03-2005 à 19:33:42  profilanswer
 

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


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
n°1030271
Tonio94
Posté le 30-03-2005 à 19:35:05  profilanswer
 

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 z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
n°1030401
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-03-2005 à 21:40:18  profilanswer
 

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/
n°1030630
Taz
bisounours-codeur
Posté le 31-03-2005 à 01:02:30  profilanswer
 

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

n°1030646
plofplof
Posté le 31-03-2005 à 06:03:56  profilanswer
 

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.

n°1030648
Tonio94
Posté le 31-03-2005 à 07:00:03  profilanswer
 

ok merci all


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
n°1030741
Taz
bisounours-codeur
Posté le 31-03-2005 à 10:05:00  profilanswer
 

relis mon message et le man de snprintf

n°1031234
Tonio94
Posté le 31-03-2005 à 15:25:25  profilanswer
 

ok :-)


---------------
~ Msi z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti
n°1031552
matafan
Posté le 31-03-2005 à 18:04:03  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Ecrire dans un fichier

 

Sujets relatifs
Ecrire le contenu d'une structure dans un fichierComment ecrire/lire bit à bit dans un fichier en langage c/c++ ?
[C#] Ouvrir un fichier texte et écrire dedans avec "WriteLine()"streams : connaître la taille totale du fichier avant d'écrire
[JS] écrire dans un fichier côté client ?Ecrire dans un fichier avec TFileStream...
[C] Ecrire le contenu d'une matrice dans un fichierEcrire dans un fichier excel
lire et écrire dans un fichier [résolu]ecrire dans fichier texte sans retour à la ligne
Plus de sujets relatifs à : Ecrire dans un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR