Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
fseek et stdout
Envoyé par: ofkain

Salut,

Bon alors desolé pour ce sujet qui vas faire mal aux yeux aux anciens du C winking smiley
Je cherchais un moyen de formater comme je veux la stdout (ecrire un truc, pouvoir revenir dessus, l'ecraser etc... ), je me suis dis que fseek ferais super bien l'affaire, seulement stdin, out et err n'acceptent pas ce traitement...

D'ou mes questions :

- n'y a t-il vraiment aucun moyen de faire un fseek sur stdout?
- sinon comment faire pour formater comme on veut la stdout? en gros comment fait ncurses?
- Pourquoi fseek ne fonctionne pas sur la stdout???

Merci d'avance pour vos reponses

Poste le Thursday 13 September 2007 19:05:47
Répondre     Citer    
Re: fseek et stdout

Le fait que stdout n'accepte pas fseek est dû au fait que c'est habituellement un terminal. Si on le redirige vers un fichier, ça marche.
Ainsi avec un fichier eseek.c comme
 // fichier eseek.c
#include <stdio.h>
int main(void) {
  if (fseek(stdout,10, SEEK_CUR)) perror("fseek");
  puts("ici\n");
  return 0;
}

compilé avec
gcc -O -Wall eseek.c -o eseek
on n'a pas de diagnostic,
puis exécuté dans un terminal avec
./eseek
on obtient bien l'erreur.
% ./eseek
fseek: Illegal seek
ici
Si on copie la source et qu'on y redirige la sortie standard il n'y a plus d'erreur
cp eseek.c fich.out
./eseek > fich.out

Pour que fseek fonctionne, il faut que ça soit sur un vrai fichier, pas un tube (nommé ou anonyme) ni une sockette ni un terminal.
Mais faire du fseek sur la sortie standard est de très mauvais goût. C'est même très mal élévé ];-)


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Thursday 13 September 2007 19:56:10
Répondre     Citer    
Re: fseek et stdout

Pour savoir comment fait ncurses, il faut consulter ses sources (ou bien le strace-r). Il fait probablement d'abominables ioctl.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Thursday 13 September 2007 19:57:44
Répondre     Citer    
Re: fseek et stdout
Envoyé par: ofkain

Merci pour tes explications, pour le mauvais gout de fseek sur stdout, je m'en doutais un peu ^^
Je crois avoir trouvé une idée pour faire ce que je veux plus ... proprement

Poste le Thursday 13 September 2007 21:24:09
Répondre     Citer    
Re: fseek et stdout
Envoyé par: ofkain

Bon, une dernière question pour ce soir et je vous laisse tranquille winking smiley

Voila, lorsque je compile ceci :
  socklen_t sin_size=sizeof(struct sockaddr_in);
  int peerfd;

  peerfd=accept(rsock, (struct sockaddr *)peer_sockaddr, &sin_size);
  if (peerfd == -1) {
    perror("accept");
    return -1; }

J'obtiens un warning :
attention : pointer targets in passing argument 3 of ‘accept’ differ in signedness

J'arrives pas a m'en débarrasser et il me gène, j'ai bien compris le dernier coup que laisser des warnings c'etais pas une bonne idée ^^

Poste le Thursday 13 September 2007 23:51:44
Répondre     Citer    
Re: fseek et stdout
Envoyé par: Sve@r

Citation
ofkain
Bon, une dernière question pour ce soir et je vous
laisse tranquille winking smiley

Voila, lorsque je compile ceci :
socklen_t
sin_size=sizeof(struct sockaddr_in);
int peerfd;

peerfd=accept(rsock, (struct sockaddr
*)peer_sockaddr, &sin_size);
if (peerfd == -1) {
perror("accept");
return -1; }

J'obtiens un warning :
attention : pointer targets in passing argument 3
of ‘accept’ differ in signedness

J'arrives pas a m'en débarrasser et il me gène,
j'ai bien compris le dernier coup que laisser des
warnings c'etais pas une bonne idée ^^

Pour résumer, un "warning" c'est grosso-modo un message du compilo signifiant "je ne suis pas certain que ce que je lis soit bien ce que vous voulez faire. Donc je compile à vos risques et périls"

En l'état, il me semble que le 3° paramètre de "accept" doit être un pointeur sur int et non un pointeur sur "sin_size". Mais bien sûr, mes connaissances sockets datent de l'époque Unix et il est possible que sur Linux cela ait évolué. De toute façon, un bon coup de man peut pas faire de mal...


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 14 September 2007 01:43:14
Répondre     Citer    
Re: fseek et stdout
Envoyé par: ofkain

extrait du man 2 accept :

int accept(int sock, struct sockaddr *adresse, socklen_t *longueur);

L'argument longueur est un paramètre-résultat : il doit contenir initialement la taille de la structure pointée par adresse, et est renseigné au retour par la longueur réelle (en octet) de l'adresse remplie.

d'ou mon socklen_t sin_size=sizeof(struct sockaddr_in);

Je vois vraiment pas ou le compilo peut avoir un doute...

Poste le Friday 14 September 2007 12:31:49
Répondre     Citer    
Re: fseek et stdout
Envoyé par: Sve@r

Citation
ofkain
extrait du man 2 accept :

int accept(int sock, struct sockaddr *adresse,
socklen_t *longueur);

L'argument longueur est un paramètre-résultat :
il doit contenir initialement la taille de
la structure pointée par adresse, et est
renseigné au retour par la longueur réelle (en
octet) de l'adresse remplie.

d'ou mon socklen_t sin_size=sizeof(struct
sockaddr_in);

Je vois vraiment pas ou le compilo peut avoir un
doute...
Exact. Vérifie que t'as bien inclus le .h qui va bien et qui contient la signature de ta fonction...


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 14 September 2007 19:27:09
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
fseek et stdout
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons