[c]Debutant sous xp

Debutant sous xp [c] - C - Programmation

Marsh Posté le 08-12-2004 à 18:56:55    

Bonjour,
je travaille a l'école sous linuxx avec les logiciels EMACS et la console.
 
J'ai un programme a faire mais il y a un probleme.
Je suis sur XP avec Dev c++.  
Le programme affiche en numerotant, les lignes lues sur le fichier d'entrée standard...
 
J'ai ecrit ce programme et il marche tres bien sous linuxx. Et ce, en ecrivant dans la console :
 
$./cat-num < nomdufichier
 
 
Ici, je donne directement le nom du fichier a examiner (fichier sur lequel on va compter les lignes etc...)
 
 
Mais, sous XP, comment faire cela? En effet, je n'ai pas de console, donc je ne sais pas où taper le nom du fichier de l'entrée standard...!
 
 
*Existe il une version identique a celle de linuxx sous XP?
*Peut on detourner ce probleme en rajoutant dans mon programme une ligne qui va saisir le nom du fichier a examiner?
            fscanf(stdin,"%s",chaine);
->cette ligne correspond t elle a ma solution? J'ai essayé mais je ne connais pas du tout son fonctionnement.  
 
Voila ce que m'affiche dev c++ :
 
12 e:\docume~1\admini~1\bureau\cours\c\test\jefais\td3exo1.c
 `chaine' undeclared (first use in this function)
 
 
12 e:\docume~1\admini~1\bureau\cours\c\test\jefais\td3exo1.c
 (Each undeclared identifier is reported only once
 
 
12 e:\docume~1\admini~1\bureau\cours\c\test\jefais\td3exo1.c
 for each function it appears in.)
 
 
12  
 
 
 
Voici mon programme :
 
 
 
/*Ce programme affiche en numérotant les lignes lues sur l'entrée  
standard.*/
 
#include <stdio.h>
int main(void)
{
  int ligne; /*Declaration des variables.*/
  char c;
  ligne=0;
 
  printf("tape le nom du fichier : " );
  fscanf(stdin,"%s",chaine);
  getch();

 
/*Condition 'si il n y a pas de lignes dans le fichier d'entrée'*/
 
  if (c<1)
    {
      printf("il n y a pas de lignes dans le fichier." );
    }
else
  {
  printf ("%d ",ligne);
   while ((c=getc(stdin))!=EOF)
    {
 
      /*On affiche le numero de la ligne au debut de chaque ligne*/
 
      putc (c,stdout);
      /*On affiche sur l'ecran, l'entrée*/
 
      if (c=='\n')
       {
        ligne++;
        printf ("%d ",ligne);
       }
    }
  }
 
  /*On lit sur l'entrée standard*/
 
  getch();
  return 0;
 
}
 
 
 
en gras, les lignes que j'ai rajouté pour essayer de saisir le nom du fichier SOUS XP
 
 
Qui peut m'aider svp?


Message édité par zaynyy le 08-12-2004 à 19:07:30
Reply

Marsh Posté le 08-12-2004 à 18:56:55   

Reply

Marsh Posté le 08-12-2004 à 19:01:38    

t'es pas une fille, tant pis
 
Nous fais pas croire que ton programme pas sous Linux, hein, tu auras les mêmes erreurs. Faudrait voir à apprendre l'anglais. Quelle partie tu as manquée dans "chaine' undeclared (first use in this function) "
 
 
fscanf(stdin,"%s",chaine);  
-> fgets(chaine, sizeof chaine, stdin);

Reply

Marsh Posté le 08-12-2004 à 19:10:44    

Taz a écrit :

t'es pas une fille, tant pis
 
Nous fais pas croire que ton programme pas sous Linux, hein, tu auras les mêmes erreurs. Faudrait voir à apprendre l'anglais. Quelle partie tu as manquée dans "chaine' undeclared (first use in this function) "
 
 
fscanf(stdin,"%s",chaine);  
-> fgets(chaine, sizeof chaine, stdin);


 
Je ne comprends pas.
Les lignes en GRAS que j'ai rajouté, sont celles rajoutées sous XP.
fgets(chaine, sizeof chaine, stdin);
->a quoi cela correspond t il stp?
merci

Reply

Marsh Posté le 08-12-2004 à 19:16:10    

à rien. vire les

Reply

Marsh Posté le 08-12-2004 à 20:39:50    

zaynyy a écrit :

Bonjour,
je travaille a l'école sous linuxx avec les logiciels EMACS et la console.


Linux...

Citation :


J'ai un programme a faire mais il y a un probleme.
Je suis sur XP avec Dev c++.  


Aucun problème.

Citation :


Le programme affiche en numerotant, les lignes lues sur le fichier d'entrée standard...
 
J'ai ecrit ce programme et il marche tres bien sous Linux. Et ce, en ecrivant dans la console :
 
$./cat-num < nomdufichier
 
 
Ici, je donne directement le nom du fichier a examiner (fichier sur lequel on va compter les lignes etc...)
 
Mais, sous XP, comment faire cela? En effet, je n'ai pas de console, donc je ne sais pas où taper le nom du fichier de l'entrée standard...!


Aucun problème : demarrer / exécuter, puis tu lances cmd.exe. Le système ouvre une console ça se passe comme sous Linux. Rien à modifier. C'est le principe de la portabilité.
 
Attention quand même, les variables locales ('c', par exemple) nécessitent une initialisation explicite, sinon, la valeur est indeterminée.
 
Ceci fonctionne:
 

Code :
  1. /*Ce programme affiche en numérotant les lignes lues sur l'entrée   
  2.    standard. */
  3. #ifndef __linux__
  4. #include <stdlib.h>
  5. #else
  6. #endif
  7. #include <stdio.h>
  8. int main (void)
  9. {
  10.    int ligne;                   /*Declaration des variables. */
  11.    int c;
  12.    ligne = 0;
  13.    #define FMT "%3d"
  14.    printf (FMT ": ", ligne);
  15.    ligne++;
  16.  
  17.    while ((c = getc (stdin)) != EOF)
  18.    {
  19.       /*On affiche le numero de la ligne au debut de chaque ligne */
  20.       if (c == '\n')
  21.       {
  22.          printf ("\n" FMT ": ", ligne);
  23.          ligne++;
  24.       }
  25.       else
  26.       {
  27.          /*On affiche sur l'ecran, l'entrée */
  28.          putc (c, stdout);
  29.       }
  30.    }
  31.    printf ("\n" );
  32.  
  33. #ifndef __linux__
  34.    system ("pause" );
  35. #else
  36. #endif
  37.    return 0;
  38. }


Message édité par Emmanuel Delahaye le 08-12-2004 à 21:59:20

---------------
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 08-12-2004 à 21:28:16    

Emmanuel Delahaye a écrit :

Linux...

Citation :


J'ai un programme a faire mais il y a un probleme.
Je suis sur XP avec Dev c++.  


Aucun problème.

Citation :


Le programme affiche en numerotant, les lignes lues sur le fichier d'entrée standard...
 
J'ai ecrit ce programme et il marche tres bien sous Linux. Et ce, en ecrivant dans la console :
 
$./cat-num < nomdufichier
 
 
Ici, je donne directement le nom du fichier a examiner (fichier sur lequel on va compter les lignes etc...)
 
Mais, sous XP, comment faire cela? En effet, je n'ai pas de console, donc je ne sais pas où taper le nom du fichier de l'entrée standard...!


Aucun problème quand tu lances ton programme (demarrer / exécuter), le système ouvre une console ça se passe comme sous Linux. Rien à modifier. C'est le principe de la portabilité.
 
Attention quand même, les variables locales ('c', par exemple) nécessitent une initialisation explicite, sinon, la valeur est indeterminée.
 
Ceci fonctionne:
 

Code :
  1. /*Ce programme affiche en numérotant les lignes lues sur l'entrée   
  2.    standard. */
  3. #ifndef __linux__
  4. #include <stdlib.h>
  5. #else
  6. #endif
  7. #include <stdio.h>
  8. int main (void)
  9. {
  10.    int ligne;                   /*Declaration des variables. */
  11.    char c;
  12.    ligne = 0;
  13.    #define FMT "%3d"
  14.    printf (FMT ": ", ligne);
  15.    ligne++;
  16.  
  17.    while ((c = getc (stdin)) != EOF)
  18.    {
  19.       /*On affiche le numero de la ligne au debut de chaque ligne */
  20.       if (c == '\n')
  21.       {
  22.          printf ("\n" FMT ": ", ligne);
  23.          ligne++;
  24.       }
  25.       else
  26.       {
  27.          /*On affiche sur l'ecran, l'entrée */
  28.          putc (c, stdout);
  29.       }
  30.    }
  31.    printf ("\n" );
  32.  
  33. #ifndef __linux__
  34.    system ("pause" );
  35. #else
  36. #endif
  37.    return 0;
  38. }




 
J'essaie en fait un prog pour qu'il compte les lignes d'un fichier donné.
Mais cela ne marche pas avec ton programme. Je ne peux pas donner le nom du fichier a examiner.

Reply

Marsh Posté le 08-12-2004 à 21:39:46    

c'est très gentil, mais la charte de ce forum dit que la résolution d'exercices n'est pas autorisée. Sinon, c'est l'avalanche, on récupère même souvent toute la classe, chacun y allant avec son sujet, certains recopient même leur énoncé.

Reply

Marsh Posté le 08-12-2004 à 21:43:41    

zaynyy a écrit :

J'essaie en fait un prog pour qu'il compte les lignes d'un fichier donné.
Mais cela ne marche pas avec ton programme. Je ne peux pas donner le nom du fichier a examiner.


Effectivement, ça ne marche pas dans Demarrer / Exécuter. Je corrige mes posts.
 
Par contre, ça fonctionne dans une console. Il suffit de lancer 'command' sous Win9x ou 'cmd.exe' sout NT/XP.
 
Ensuite, tu tapes la commande comme sous linux, sauf que le séparateur de chemin (si besoin est) est '\' au lieu de '/'
 
 
 


---------------
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 08-12-2004 à 21:44:44    

Taz a écrit :

c'est très gentil, mais la charte de ce forum dit que la résolution d'exercices n'est pas autorisée. Sinon, c'est l'avalanche, on récupère même souvent toute la classe, chacun y allant avec son sujet, certains recopient même leur énoncé.


Oui, désolé, je me suis laissé emporté par mon enthousiasme...


---------------
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 08-12-2004 à 21:51:27    

avec une petite faute sur le getchar [:kadreg]
http://www.eskimo.com/~scs/C-faq/q12.1.html

Reply

Marsh Posté le 08-12-2004 à 21:51:27   

Reply

Marsh Posté le 08-12-2004 à 21:58:52    

Taz a écrit :

avec une petite faute sur le getchar [:kadreg]
http://www.eskimo.com/~scs/C-faq/q12.1.html


Voui! Je corrige.


---------------
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 08-12-2004 à 22:09:14    

et vous proposez quoi comme alternative ?

Reply

Marsh Posté le 08-12-2004 à 22:11:22    

push a écrit :

et vous proposez quoi comme alternative ?

à quoi?


Message édité par Taz le 08-12-2004 à 22:11:31
Reply

Marsh Posté le 08-12-2004 à 22:11:56    

Code :
  1. while((c = getchar()) != EOF)

Reply

Marsh Posté le 08-12-2004 à 22:13:25    

push a écrit :

et vous proposez quoi comme alternative ?


un if ?
 
 
ok je sors  :hello:

Reply

Marsh Posté le 08-12-2004 à 22:14:00    

ben j'ai donné un lien d'explication. Et si tu lis les 36 sujets de mosieur, j'y relève la même faute.

Reply

Marsh Posté le 08-12-2004 à 22:15:09    

Slay a écrit :

un if ?
 
 
ok je sors  :hello:

commande plutôt des lunettes et un cours d'anglais pour nowel :24:

Reply

Marsh Posté le 08-12-2004 à 22:16:28    

Taz a écrit :

ben j'ai donné un lien d'explication. Et si tu lis les 36 sujets de mosieur, j'y relève la même faute.

j'ai lu, j'ai vu ou était le problème mais à moin que je sois aveugle j'ai pas vu d'alternative  :??:

Reply

Marsh Posté le 08-12-2004 à 22:17:25    

ben ta variable doit être de type 'int'

Reply

Marsh Posté le 08-12-2004 à 22:22:42    

a ouais .. je savais pas que EOF en Dec faisait -1  :sweat:


Message édité par push le 08-12-2004 à 22:24:45
Reply

Marsh Posté le 08-12-2004 à 22:34:34    

push a écrit :

a ouais .. je savais pas que EOF en Dec faisait -1  :sweat:

le problème c'est pas que ça fasse -1 ou autre chose, le problème, c'est que faut que ça soit quelque chose qui soit pas un char pour pouvoir le détecter


Message édité par Taz le 08-12-2004 à 22:42:50
Reply

Marsh Posté le 08-12-2004 à 22:42:00    

Taz a écrit :

le problème c'est pas que ça fasse -1 ou autre chose, le problème, c'est que faux que ça soit quelque chose qui soit pas un char pour pouvoir le détecter


La norme dit 'un int négatif'. -1 est certes un valeur courante, mais il faut utiliser l'abstraction EOF pour être portable. La définition est faite par le compilateur et ses includes...


Message édité par Emmanuel Delahaye le 09-12-2004 à 08:12:34

---------------
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 08-12-2004 à 22:50:44    

ok ok j'avais saisi mais j'ai vu au passage se que valait EOF.

Reply

Marsh Posté le 08-12-2004 à 23:46:21    

je me suis un peu amusé... arrêtez moi si je dis une connerie,
 
dans le cas ou EOF représente -1, le fait de le manipuler comme un char fait qu'on se retrouve à manipuler le caratère correspondant en binaire au complément à 2 de -1 à savoir 255 pour un octet. Donc ça aurait posé problème si on avait eut le caractère ÿ dans le flux.
 

Code :
  1. #include <stdio.h>
  2.                                                                                
  3. int main(void)
  4. {
  5. char c = 'ÿ';
  6.                                                                                
  7. if(c == EOF) {
  8. printf("push\n" );
  9. }
  10.                                                                                
  11. return 0;
  12. }


 
plop@Antec plop $ ./a.out
push


Message édité par push le 09-12-2004 à 00:06:17
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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