Aller au menu - Aller au contenu

Exercices pour débutants en C

Au menu : zSommeChiffres (nombres, algo)

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3  4  5  6  ...  50  51  52  53  Suivante
Auteur Message
2 visiteurs sur ce sujet (1 membre et 1 Anonyme) : m@tteo78
Page Précédente  1  2  3  4  5  6  ...  50  51  52  53  Suivante
Hors ligne shareman # Posté le 16/10/2008 à 23:55:35
charlotte <3
Avatar

Ville : Mertzwiller
Pays : France métropolitaine

Reprise du dernier message de la page précédente :
Postes ton code, il n'y a pas de problème. :) Ce n'est que ainsi que l'on pourra te répondre.

Nouvel atelier : Codez votre propre petit préprocesseur pour langage C !
Citation : Woody Allen
Si l'au-delà existe, c'est à quelle distance du centre ville, et c'est ouvert jusqu'à quelle heure ?
 
Hors ligne gouttegd # Posté le 17/10/2008 à 00:06:39
Serenity is a RAID 1 array.
Avatar

Citation : noob4ever
Citation : Pas de titre
Mon second problème est que ça ne me plait pas de limiter la taille de l'adresse donnée et la taille du texte que l'on veut écrire dans le fichier choisit, y a-il un moyen pour éviter ça ? (j'ai penser a l'allocation dynamique mais je ne veut pas non plus demander a l'utilisateur de prévoir le nombre de caractères qu'il compte taper :euh: )

C'est les limites de la console, la solution est de passé en IHM avec une RichTextBox.

Quelles limites ? Il suffit d’allouer un bloc mémoire d’une taille donnée (arbitraire), et au cours de la saisie, de redimensionner le bloc si besoin (avec realloc), jusqu’à ce que la saisie soit terminée.

Nul besoin de sortir le mode graphique (a fortiori une RichTextBox) pour ça...
Édité le 17/10/2008 à 00:07:05 par gouttegd

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne Fion # Posté le 17/10/2008 à 09:55:14
Avatar

Ville : Besançon
Pays : France métropolitaine
études : BTS IRIS

Re salut!
Merci noobforever pour l'info!
Mais même après lecture et relecture du tuto de matheo, moi pas comprendre XD

je comprend pourquoi il faut vider le buffer, mais je comprend pas la fonction clean :S


C'est ok merci ;)
Édité le 17/10/2008 à 10:05:27 par Fion
 
Hors ligne yoch # Posté le 17/10/2008 à 13:09:48
Avatar

Citation : gouttegd
Quelles limites ? Il suffit d’allouer un bloc mémoire d’une taille donnée (arbitraire), et au cours de la saisie, de redimensionner le bloc si besoin (avec realloc), jusqu’à ce que la saisie soit terminée.

Nul besoin de sortir le mode graphique (a fortiori une RichTextBox) pour ça...

+1

Mais je précise qu'en C standard, pas évident de suivre ce qui se passe au cours de la saisie (tant que l'utilisateur n'appuie pas sur entrée). Je crois qu'il faut donc faire appel a une lib tierce (ou l'API système) pour cela.
Édité le 17/10/2008 à 13:13:12 par yoch
 
Hors ligne gouttegd # Posté le 17/10/2008 à 17:32:04
Serenity is a RAID 1 array.
Avatar

@ yoch : Ah bon ?

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int
read_line(char **buffer, size_t *len, FILE *f)
{
    char c = 0;
    int n = 0;

    if ( buffer == NULL || len == NULL ) {
        return -1;
    }

    if ( *buffer == NULL ) {
        *len = 0;
    }

    while ( c != '\n' && (c = fgetc(f)) != EOF ) {
        if ( n >= *len ) {
            /* Le tampon est plein (ou il n'a encore jamais été
             * alloué), on le redimensionne (ou on l'alloue). */
            *len += 512;
            *buffer = realloc(*buffer, *len);
        }

        /* On stocke le caractère lu dans le tampon. */
        *(*buffer + n++) = c;
    }

    /* On retourne le nombre de caractères lus (-1 si on est à
     * la fin du flux). */
    return n > 0 ? n : -1;
}

Il n’y a là que du C standard, et sauf erreur bête de ma part (je n’ai pas le temps de tester), ça marche.

On peut ainsi lire une ligne entière (jusqu’au premier caractère '\n', c’est-à-dire jusqu’à un appui sur la touche <Entrée> si on lit depuis le terminal), quelque que soit sa longueur :
Code : C
1
2
3
4
char *buffer = NULL;
size_t buffer_len;

read_line(&buffer, &buffer_len, stdin);

C’est plus ou moins le comportement de la fonction (non standard) getline de la bibliothèque C GNU.

Donc, nul besoin de changer le comportement du terminal pour lire les caractères un par un (ce qui, effectivement, serait impossible avec la seule bibliothèque C standard).

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne noob4ever # Posté le 17/10/2008 à 17:33:21
戦争は変わった

Ville : Gilly sur isère
Pays : France métropolitaine

Citation : gouttegd
Citation : noob4ever
Citation : Pas de titre
Mon second problème est que ça ne me plait pas de limiter la taille de l'adresse donnée et la taille du texte que l'on veut écrire dans le fichier choisit, y a-il un moyen pour éviter ça ? (j'ai penser a l'allocation dynamique mais je ne veut pas non plus demander a l'utilisateur de prévoir le nombre de caractères qu'il compte taper :euh: )

C'est les limites de la console, la solution est de passé en IHM avec une RichTextBox.

Quelles limites ? Il suffit d’allouer un bloc mémoire d’une taille donnée (arbitraire), et au cours de la saisie, de redimensionner le bloc si besoin (avec realloc), jusqu’à ce que la saisie soit terminée.

Nul besoin de sortir le mode graphique (a fortiori une RichTextBox) pour ça...

On est d'accord, il y a une différence entre trouver un algorithme pour prévoir une marge de manoeuvre, faire des realloc et peut-être même se taper des memory leak et tout le blabla, et faire une petite richtextbox toute jolie.
Hors ligne gouttegd # Posté le 17/10/2008 à 17:37:34
Serenity is a RAID 1 array.
Avatar

@ noob4ever : Lis le code juste au-dessus, et dis-moi que l'API Win32 est plus simple.

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne noob4ever # Posté le 17/10/2008 à 17:51:40
戦争は変わった

Ville : Gilly sur isère
Pays : France métropolitaine

Citation : gouttegd
@ noob4ever : Lis le code juste au-dessus, et dis-moi que l'API Win32 est plus simple.

Dit moi si ça est plus simple ?
Code : C
1
2
GtkWidget* text_view=gtk_text_view_new();
gtk_box_pack_start(GTK_BOX(box),text_view,TRUE,TRUE,0);


Hors ligne gouttegd # Posté le 17/10/2008 à 18:00:12
Serenity is a RAID 1 array.
Avatar

OK, GTK+, si tu préfères. Et maintenant que tu as créé ta jolie RichTextBox, tu t’en sers comment ? Comment tu réagis aux entrées de l’utilisateur, comment récupères-tu le texte saisi ?

De toute façon, peu importe. Tu affirmais qu’il fallait passer à une IHM en mode graphique pour saisir du texte, ce qui est absurde et je te l’ai montré. Après, si tu ne veux pas le reconnaître ou si tu préfères ajouter une dépendance à un toolkit graphique pour un truc aussi élémentaire, c’est ton problème.
Édité le 17/10/2008 à 18:01:38 par gouttegd

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne noob4ever # Posté le 17/10/2008 à 18:08:11
戦争は変わった

Ville : Gilly sur isère
Pays : France métropolitaine

Citation : Pas de titre
ajouter une dépendance à un toolkit graphique pour un truc aussi élémentaire, c’est ton problème.

élémentaire ? lol ?! et le problème de dépendre à GTK+ qui est portable ?
On est pas dans la même longueur d'onde, mais si tu préfères faire compliqué je respecte ton choix ;) .

EDIT: j'oubliais, j'ai effectivement dit

Citation : Pas de titre
C'est les limites de la console, la solution est de passé en IHM avec une RichTextBox.

Et je sais que tu es très rigoureux donc pour me corriger je remplace "limites" par inconvénient?
Édité le 17/10/2008 à 18:10:46 par noob4ever
Hors ligne gouttegd # Posté le 17/10/2008 à 18:11:48
Serenity is a RAID 1 array.
Avatar

Si tu préfères faire des programmes en mode graphique, je respecte ton choix. :) Mais ne viens pas prétendre que la solution est de « passé (sic) en IHM » (sous-entendu, IHM graphique), parce que les autres solutions te semblent plus compliquées.

[edit]Citation : noob4ever
EDIT: j'oubliais, j'ai effectivement dit
Citation
C'est les limites de la console, la solution est de passé en IHM avec une RichTextBox.

Et je sais que tu es très rigoureux donc pour me corriger je remplace "limites" par inconvénient?

Non, tu remplaces toute la phrase par « je ne saurais pas le faire en mode console, donc je te propose de le faire en mode graphique à la place. » Là, ce sera correct.
Édité le 17/10/2008 à 18:14:34 par gouttegd

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne DzEt4 # Posté le 17/10/2008 à 18:35:11
Avatar

Ville : Paris
Pays : France métropolitaine
études : ECE

Salut à tous, je pense que je ais abandonner l'idée de taille non limitée, en effet je n'ai pas tout à fait comprit ton code gouttegd...

Pour le premier problème, voici le code de ma "fonction" lireFichier, j'utilise les fonctions de lecture de M@teo21 dans sa partie sur la saisie sécurisée :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void lireFichier(void)
{
    FILE *fichier = NULL;
    char adresse[100] = "";
    char contenu[TAILLE_MAX] = ""; // TAILLE MAX vaut 1000 (peut d'intérêt pour mon problème mais bon :p )

    printf ("Veuillez entrer le chemin absolu du fichier que vous voulez lire.\n");
    printf ("Si vous etes sous windows, merci de taper les \\ en double.\n\n");
    lire (adresse, 100);
    printf ("\n");

    fichier = fopen (adresse, "r");

    if (fichier != NULL)
    {
        rewind (fichier);  // Avec ou sans j'ai le même problème

        while (fgets(contenu, TAILLE_MAX, fichier) != NULL)
        {
            printf ("%s", contenu);
        }

        fclose(fichier);
    }

    else
    {
        printf ("Impossible d'ouvrir le fichier, verifiez le chemin donne.\n");
    }

}

Édité le 17/10/2008 à 18:35:38 par DzEt4

«Qui connaît l'autre et se connaît, en cent combats ne sera point défait; qui ne connaît l'autre mais se connaît, sera vainqueur une fois sur deux; qui ne connaît pas plus l'autre qu'il ne se connaît sera toujours défait.»

—L'art de la guerre - Sun Tzu
 
Hors ligne gouttegd # Posté le 17/10/2008 à 18:49:09
Serenity is a RAID 1 array.
Avatar

Citation : DzEt4
Salut à tous, je pense que je ais abandonner l'idée de taille non limitée, en effet je n'ai pas tout à fait comprit ton code gouttegd...

C’est probablement un peu de ma faute, je l’ai écrit « à l’arrache » et je n’ai pas spécialement cherché à le rendre compréhensible du premier coup par un débutant. Le but était seulement de montrer que c’est parfaitement faisable entièrement en C standard.

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne Natal # Posté le 17/10/2008 à 19:24:47
Chaque seconde compte.
Avatar

Salut à tous!
Dite moi s'il vous plait pour quel débutant vous faites ces exercices?
Parce que là j'ai entamé des révisons et je pensé que je trouverai des exos sur les fonctions, des boucles etc... :lol: des trucks vraiment facile et là j'ai l'impression que vous faite des truck apprit après les pointeurs. o_O (d'après le tuto de M@teo21)

Or je fais des révisions pour être sûr de pas me prendre une raclée.
(au niveau des pointeurs) :-°

Donc si quelqu'un à une idée d'éxo (mise en vrac vite fait) pour les vrais zéros, les vrais nul quoi :p , qu'il ne se gène pas.

ps: (Au faite, j'ai un petit problème, je ne vois pas les message en entier! on dirait que mon écran est trop petit, je crois que c'est un problème de zoom, ou se trouve l'endroit pour le changer? vous savez il est écrit en %^^)

Merci!
Édité le 17/10/2008 à 19:27:36 par Natal

Vous pensez que la vie n'est qu'un long fleuve tranquille?
Vous vous trompez!
Chaque seconde de votre vie est en danger!
 
Hors ligne shareman # Posté le 17/10/2008 à 20:22:00
charlotte <3
Avatar

Ville : Mertzwiller
Pays : France métropolitaine

Salut,

Ces exercices sont pour ceux qui sont en train de lire les tutoriels de m@teo21. Si tu en as fini le chapitre sur la manipulation des fichiers, tu es en mesure de d'entraîner à l'exercice zReader. Sinon, tu attends le prochain, il viendra assez rapidement. Concernant le sujet, tu seras vite fixé mais si tu as lu la première partie du cours de m@teo21, tu dois pourvoir le faire et tu ne pourras que t'améliorer ! :)

Je conçois ces exercices pour qu'ils soient réalisables pour les débutants. Après il y a aussi plusieurs niveaux de débutants.
crys'

Nouvel atelier : Codez votre propre petit préprocesseur pour langage C !
Citation : Woody Allen
Si l'au-delà existe, c'est à quelle distance du centre ville, et c'est ouvert jusqu'à quelle heure ?
 
Hors ligne zx-spectrum # Posté le 18/10/2008 à 09:25:25
http://www.worldofspectrum.org
Avatar

bonjour Chris,
j'ai commencé l'exo, merci de prendre du temps avec nous les Zéroszeros :)
Bon ca vaut que cela vaut je me suis pas trop preocupé du contenu du fichier a creer !
je t'envoie mon code.Code : C
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <stdio.h>
#include <stdlib.h>

#define nomFichier "fic.000"
#define tailleLecture 80


FILE *fichier = NULL;

void creerFichier();
void lireFichier();
void ecrireFichier();
void Pause(int finPause);
void Presentation();
void AffichageMenu();


int main()
{
    int continuer=1;
    while (continuer != 0)
    {
        system("cls");
        Presentation();
        AffichageMenu();
        printf("\n .......................................................................... \n");
        printf("voulez vous continuer 0= non / 1=oui ? :");
        scanf("%d",&continuer);
    }
    return 0;
}

void creerFichier()
{
    //system ("edit  fic.000");
    printf(" taper control Z et entrer merci");
    system ("copy con: fic.000");

}


void lireFichier()
{
    char chaine[tailleLecture];
    fichier = fopen( nomFichier , "r");// je peux lire uniquement
    if (fichier != NULL)
    {
         // lecture possible
        while (fgets(chaine,tailleLecture,fichier) != NULL)
        {
            printf("%s",chaine);
        }

        // fermeture fichier
        fclose(fichier);
    }
    else
    {
        //lecture impossible
    }

}


void ecrireFichier()
{
    char chaine[80];
    fichier = fopen( nomFichier , "r+");// je peux lire et ecrire
    if (fichier != NULL)
    {
        // ecriture possible
        fseek(fichier,0,SEEK_END);
        printf("quel mot voulez vous rajouter au fichier ?\n");
        scanf("%s",chaine);
        fprintf(fichier,chaine);
        fprintf(fichier,"\n");
        fclose(fichier);
    }
    else
    {
        //lecture impossible
    }
}



void Pause(int finPause)
{
    long i;
    finPause=2000000*finPause;//environ 1 seconde de repis
    for (i=0;i<finPause;i++)
    {
    }
}


void Presentation()
{
    printf("Mon premier projet en C, mon premier challenge. \n");
    printf("_______________________________________________ \n");
    printf("voici l'enonce du probleme \n \n");
    printf(" creer un fichier, pouvoir y ecrire, le lire \n");
    printf("________________________________________________\n\n");

}

void AffichageMenu()
{
    long choix=0;
    while (choix==0)
    {
       //system("cls"); // efface la console sous windows !
       printf("1 : creer un fichier\n");
       printf("2 : lire le fichier \n");
       printf("3 : ecrire dans le fichier \n");
       scanf("%ld",&choix);
       switch (choix)
       {
           case 1 :
           printf("choix 1 : creer un fichier\n");
           creerFichier();
           break;

           case 2 :
           printf("choix 2 : lire dans le fichier \n");
           lireFichier();
           break;

           case 3 :
           printf("choix 3 : ecrire dans le fichier \n");
           ecrireFichier();
           break;

           default :
           printf("Erreur recommencer votre choix\n");
           break;
       }
    }
}






Finalement j'ai le problème suivant lors de la creation de mon fichier ! la seule solution que j'ai trouvé c'est de passer par une fonction de system

Comment fait on en C, dans l'excellent cours de mateo j'ai pas vu ?

Merci, le 000 que je suis ! :p
Hors ligne Brugnar # Posté le 18/10/2008 à 09:39:47
Pong 4ever
Avatar

études : IUT Annecy

Citation : zx-spectrum
Finalement j'ai le problème suivant lors de la creation de mon fichier ! la seule solution que j'ai trouvé c'est de passer par une fonction de system

Comment fait on en C, dans l'excellent cours de mateo j'ai pas vu ?

Va relire le tuto de M@téo sur les fichiers, notamment les différent mode d'ouverture de fichiers, les parties en italique.
 
Hors ligne ttthebest # Posté le 18/10/2008 à 09:52:52
Avatar

Ville : Paris
Pays : France métropolitaine

Au fait crys' quand on t'envoie un code est-ce que tu réponds en disant genre "tu pourrais améliorer ici, ou là" ou "non ton truc bugue ici", etc. ?

God said : Thou shalt indent with four spaces, neither more, nor less, young padawan.

Image utilisateur
 
Hors ligne zx-spectrum # Posté le 18/10/2008 à 09:54:01
http://www.worldofspectrum.org
Avatar

Merci, Va falloir que je m'achète des binocles ! :)
reponse : mode d'ouverture "a+"
merci. :-°
Hors ligne Brugnar # Posté le 18/10/2008 à 09:56:22
Pong 4ever
Avatar

études : IUT Annecy

Citation : zx-spectrum
Merci, Va falloir que je m'achète des binocles ! :)
reponse : mode d'ouverture "a+"
merci. :-°

Il n'y a pas que a+.

w, a, w+, a+.
 
Hors ligne mumbly # Posté le 18/10/2008 à 10:02:27
Avatar

Je suis aussi un gros triple zéro, je fait l'exercice aussi et voila ce que je fait pour créer mon fichier si sa peut t'aider.

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char creer[100] = {0}, enter[100] = {0};
                      
    printf("Quel est le nom et son extention, du fichier a creer ? \n");
    scanf("%s", creer);
    fichier = fopen(creer, "w");
    if (fichier != NULL)
    {
        // On crée le fichier et ont le ferme.
        fclose (fichier);        
    }
    else
    {
         printf("Impossible de creer le fichier %s", creer);
    }
}


édité : correction de mon ereure faut toujours ce relire.
Édité le 18/10/2008 à 10:09:50 par mumbly
Hors ligne Brugnar # Posté le 18/10/2008 à 10:05:03
Pong 4ever
Avatar

études : IUT Annecy

Code : C
1
printf("Impossible de creer le fichier %c", creer);

Erreur dans le format, pour une chaine de caractère, c'est %s
 
Hors ligne shareman # Posté le 18/10/2008 à 13:08:12
charlotte <3
Avatar

Ville : Mertzwiller
Pays : France métropolitaine

Citation : ttthebest
Au fait crys' quand on t'envoie un code est-ce que tu réponds en disant genre "tu pourrais améliorer ici, ou là" ou "non ton truc bugue ici", etc. ?

Quand c'est nécessaire, sinon, je ne fais que regarder vos codes et tester s'ils fonctionnent. Lors de la correction de l'exercice, je pourrais par exemple retenir tel ou tel code et le présenter à tous. ;)
Édité le 18/10/2008 à 13:09:34 par shareman

Nouvel atelier : Codez votre propre petit préprocesseur pour langage C !
Citation : Woody Allen
Si l'au-delà existe, c'est à quelle distance du centre ville, et c'est ouvert jusqu'à quelle heure ?
 
Hors ligne ttthebest # Posté le 18/10/2008 à 15:04:27
Avatar

Ville : Paris
Pays : France métropolitaine

D'accord merci :)

God said : Thou shalt indent with four spaces, neither more, nor less, young padawan.

Image utilisateur
 
Hors ligne yoch # Posté le 18/10/2008 à 20:14:52
Avatar

Citation : gouttegd
@ yoch : Ah bon ?

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int
read_line(char **buffer, size_t *len, FILE *f)
{
    char c = 0;
    int n = 0;

    if ( buffer == NULL || len == NULL ) {
        return -1;
    }

    if ( *buffer == NULL ) {
        *len = 0;
    }

    while ( c != '\n' && (c = fgetc(f)) != EOF ) {
        if ( n >= *len ) {
            /* Le tampon est plein (ou il n'a encore jamais été
             * alloué), on le redimensionne (ou on l'alloue). */
            *len += 512;
            *buffer = realloc(*buffer, *len);
        }

        /* On stocke le caractère lu dans le tampon. */
        *(*buffer + n++) = c;
    }

    /* On retourne le nombre de caractères lus (-1 si on est à
     * la fin du flux). */
    return n > 0 ? n : -1;
}

Il n’y a là que du C standard, et sauf erreur bête de ma part (je n’ai pas le temps de tester), ça marche.

On peut ainsi lire une ligne entière (jusqu’au premier caractère '\n', c’est-à-dire jusqu’à un appui sur la touche <Entrée> si on lit depuis le terminal), quelque que soit sa longueur :
Code : C
1
2
3
4
char *buffer = NULL;
size_t buffer_len;

read_line(&buffer, &buffer_len, stdin);

C’est plus ou moins le comportement de la fonction (non standard) getline de la bibliothèque C GNU.

Donc, nul besoin de changer le comportement du terminal pour lire les caractères un par un (ce qui, effectivement, serait impossible avec la seule bibliothèque C standard).

Mea culpa, je suis stupide de ne pas avoir pensé a fgetc... Merci de m'avoir corrigé ! :)

Je me permet de corriger un petit oubli dans ta fonction :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int read_line(char **buffer, size_t *len, FILE *f)
{
    char c = 0;
    size_t n = 0;

    if ( buffer == NULL || len == NULL )
    {
        return -1;
    }

    if ( *buffer == NULL )
    {
        *len = 0;
    }

    while ( c != '\n' && (c = fgetc(f)) != EOF )
    {
        if ( n >= *len )
        {
            /* Le tampon est plein (ou il n'a encore jamais été
             * alloué), on le redimensionne (ou on l'alloue). */
            *len += 512;
            *buffer = realloc(*buffer, *len + 1);
        }

        /* On stocke le caractère lu dans le tampon. */
        *(*buffer + n++) = c;
    }
    /* On termine la chaine par un caractere nul */
    *(*buffer + n) = '\0';
    /* On retourne le nombre de caractères lus (-1 si on est à
     * la fin du flux). */
    return (n > 0) ? (int) n : -1;
}

J'aurais pensé que l'on ne peut pas corriger la saisie, mais j'ai testé et on peut...
Des explications ?
 
Hors ligne gouttegd # Posté le 18/10/2008 à 20:43:21
Serenity is a RAID 1 array.
Avatar

Citation : yoch
Je me permet de corriger un petit oubli dans ta fonction :
Code : C
1
2
/* On termine la chaine par un caractere nul */
*(*buffer + n) = '\0';

Naturellement, c’était un oubli volontaire, pour voir si tout le monde suivait. :-°

Citation : yoch
J'aurais pensé que l'on ne peut pas corriger la saisie, mais j'ai testé et on peut...

On n’a pas changé le comportement du terminal, donc celui-ci continue à n’envoyer la saisie à l’application qu’après un appui sur <Entrée>. Tant qu’on a pas appuyé sur <Entrée>, la chaîne saisie est encore au niveau du terminal, et il donc encore possible de l’éditer.

À l’appui de <Entrée>, le terminal envoie toute la chaîne à l’application, où elle est stockée dans le tampon de la bibliothèque C associé à stdin. C’est dans ce tampon que fgetc va chercher les caractères un par un.

Si tu voulais vraiment recevoir les caractères sitôt après la frappe de la touche correspondante (et non après <Entrée>), il est indispensable de changer le comportement du terminal, ce qui, pour le coup, n’est effectivement pas possible en C standard.

« Je vous aiderai si vous me promettez d'aider quelqu'un d'autre en retour. » --- Anonyme
« Soyez vigilant lorsque vous vous exprimez dans un forum électronique. Vos fautes de frappes et de syntaxe vous poursuivront pour l'éternité. » --- Linus B. Torvalds

De la gestion automatique des dépendances...
 
Hors ligne yoch # Posté le 18/10/2008 à 21:38:55
Avatar

Hors ligne shareman # Posté le 19/10/2008 à 16:05:43
charlotte <3
Avatar

Ville : Mertzwiller
Pays : France métropolitaine

Salut à tous,

Je ne serais pas là du dimanche 26 au jeudi 30, je posterais donc le prochain exercice (et la correction du premier si j'ai le temps) un peu plus tôt que prévu (mercredi ou samedi). ;)
Merci pour votre compréhension.

Nouvel atelier : Codez votre propre petit préprocesseur pour langage C !
Citation : Woody Allen
Si l'au-delà existe, c'est à quelle distance du centre ville, et c'est ouvert jusqu'à quelle heure ?
 
Hors ligne zx-spectrum # Posté le 20/10/2008 à 18:46:46
http://www.worldofspectrum.org
Avatar

On te souhaites de bonne vacances.
merci pour ton initiative du 000 que je suis !
@+
Hors ligne zoukini22 # Posté le 21/10/2008 à 23:32:21

Conseil très très utile a mon avis, faire beaucoup plus d'exercice. Et aussi des exercices "amusants", par exemple des jeux comme Plus ou moins, ou encore le pendu. Les gens adorent programmer des jeux

a++!
Hors ligne shareman # Posté le 22/10/2008 à 17:34:40
charlotte <3
Avatar

Ville : Mertzwiller
Pays : France métropolitaine

Correction pour zReader



Envois des résultats à réponse : 10

J'ai donc décidé d'apporter la correction du premier exercice de ce topic aujourd'hui. Un codage "simple" pour atteindre le but de l'exercice n'aurait pas dû poser de gros problèmes. Tout ce qu'il fallait savoir se trouvait dans le tutoriel de m@teo21. ;)
Dans les codes que j'ai reçu, c'était quasiment toujours de la qualité et tous les codes fonctionnaient correctement. Je reprocherais donc juste à certains de ne pas permettre à l'utilisateur de zReader de retourner au menu.

Voici donc mon code, il n'est pas parfait mais exploite déjà pas mal de notions du tuto de m@teo21 :
Secret (cliquez pour afficher)
Code : C
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define TAILLE 5000

typedef struct fichier
{
    FILE* doc;
    char* chemin;
} fichier;

void read(fichier*);
void write(fichier*);
void creat(fichier*);

void buf(){
    int c = 0;
    while ((c = getchar()) != '\n');
}
void wait(){
    printf("\n Appuyez sur entrer pour retourner au menu...");
    buf();
}
void strcle(char* str){
    char* d = strchr(str, '\n');
    if (d) *d = '\0';
    else buf();
}

int main()
{
    fichier monFichier;
    monFichier.doc = NULL;
    monFichier.chemin = NULL;
    char choixSec[2];
    int choix;

    printf("\n Bienvenue sur zReader - lisez, cr\x82""ez et \x82""crivez dans vos fichiers !\n");

    do{
        printf("\n 1. Lire"
               "\n 2. Ecrire"
               "\n 3. Cr\x82""er"
               "\n 4. Quitter \n"
               "\n Votre choix ? ");

        fgets(choixSec,2,stdin); buf();
        choix = atoi(choixSec);

        if(choix == 1) read(&monFichier);
        else if(choix == 2) write(&monFichier);
        else if(choix == 3) creat(&monFichier);
        else if(choix == 4) break;
        else printf("\n Mauvaise saisie !\n");

    }while(1);

    return EXIT_SUCCESS;
}

void read(fichier* monFichier)
{
    monFichier->chemin = malloc(TAILLE * sizeof(char));
    char c[TAILLE];

    printf("\n Entrez le chemin du fichier : ");
    fgets(monFichier->chemin, TAILLE, stdin);
    strcle(monFichier->chemin);
    printf("\n\n");

    if(monFichier->doc = fopen(monFichier->chemin,"r"))
    {
        printf(" Contenu du fichier : \n\n");
        while (fgets(c,TAILLE,monFichier->doc) != NULL)
        printf(c);
        fclose(monFichier->doc);
    }
    else
    {
        printf(" Le fichier n'existe pas ! \n");
    }
    free(monFichier->chemin);
    wait();
}

void write(fichier* monFichier)
{
    monFichier->chemin = malloc(TAILLE * sizeof(char));
    char inputInFile[TAILLE*3];

    printf("\n Entrez le chemin du fichier (si invalide, le fichier sera cr\x82""e) : ");
    fgets(monFichier->chemin, TAILLE, stdin);
    strcle(monFichier->chemin);
    printf("\n\n");

    monFichier->doc = fopen(monFichier->chemin,"w");
    printf(" Saisie dans le fichier (pour fermer, tapez \"f.close\") : \n\n");
    while(fgets(inputInFile,TAILLE*3,stdin))
    {
        if (strstr(inputInFile,"f.close"))
            break;
        fputs(inputInFile,monFichier->doc);
    }
    fclose(monFichier->doc);
    free(monFichier->chemin);
    printf("\n Contenu enregistr\x82"".");
    wait();
}

void creat(fichier* monFichier)
{
    char path[TAILLE];
    char ext[30];

    printf("\n\n Nom du fichier (extension non-incluse) : ");
    fgets(path,TAILLE,stdin);
    strcle(path);
    printf("\n Extension du fichier : ");
    fgets(ext,30,stdin);
    strcle(ext);

    strcat(path,".");
    strcat(path,ext);

    monFichier->doc = fopen(path,"w");
    fclose(monFichier->doc);
    printf("\n Fichier cr\x82""e avec succ\x8a""s \n\n");
}

Nous avons ici une utilisation des notions de structure, d'allocation dynamique, de define, de manipulation des fichiers, etc...

Ce soir encore j'espère : le prochain exercice. :)
Édité le 22/10/2008 à 18:32:50 par shareman

Nouvel atelier : Codez votre propre petit préprocesseur pour langage C !
Citation : Woody Allen
Si l'au-delà existe, c'est à quelle distance du centre ville, et c'est ouvert jusqu'à quelle heure ?
 

Retour au forum "Langage C" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx