Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 328751Cette discussion

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.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » fseek et stdout
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
fseek et stdout
Auteur: ofkain (IP enregistrée)
Date: le 13 septembre 2007 à 19:05

Salut,

Bon alors desolé pour ce sujet qui vas faire mal aux yeux aux anciens du C ;)
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

Re: fseek et stdout
Auteur: Basile STARYNKEVITCH (IP enregistrée)
Date: le 13 septembre 2007 à 19:56

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é image : jaybee


----

Basile STARYNKEVITCH où on trouve mon mél

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

N.B. N'hesitez pas à consulter aussi mes contributions antérieures.

Re: fseek et stdout
Auteur: Basile STARYNKEVITCH (IP enregistrée)
Date: le 13 septembre 2007 à 19:57

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

----

Basile STARYNKEVITCH où on trouve mon mél

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

N.B. N'hesitez pas à consulter aussi mes contributions antérieures.

Re: fseek et stdout
Auteur: ofkain (IP enregistrée)
Date: le 13 septembre 2007 à 21:24

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

Re: fseek et stdout
Auteur: ofkain (IP enregistrée)
Date: le 13 septembre 2007 à 23:51

Bon, une dernière question pour ce soir et je vous laisse tranquille ;)

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 ^^

Re: fseek et stdout
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 14 septembre 2007 à 01:43

ofkain a écrit :

Bon, une dernière question pour ce soir et je vous
laisse tranquille ;)

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]

Re: fseek et stdout
Auteur: ofkain (IP enregistrée)
Date: le 14 septembre 2007 à 12:31

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...

Re: fseek et stdout
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 14 septembre 2007 à 19:27

ofkain a écrit :

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]



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.