Besoin aide programmation en c

Résolu
Utilisateur anonyme -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Je débute dans le domaine de la programmation et j'ai besoin de transformer tous les caractères d'un fichier *.txt en majuscules. le fichier contient des majuscules, des minuscules et de la ponctuation, des accents etc...
J'essaye d'y arriver depuis 2 jours, mais -____-" j'y arrive pas... Pourriez-vous m'aider ?
voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define TAILLE_MAX 30

int main()
{
    FILE* fichier = NULL;
    int caractere = 0;
    int i = 0;
    char chaine[TAILLE_MAX] = "";

    fichier = fopen("liste_francais.txt", "r+");

    if (fichier != NULL)
    {
        rewind(fichier);

        while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
        {
            for (i = 0 ; i != '\0' ; i++)
            {
                if (chaine[i] >= 'A' && chaine[i] <= 'Z')
                {
                    chaine[i] = chaine[i] - 'A' + 'a';
                }
            }
        }

        fclose(fichier);
    }
    else
    {
        printf("Erreur fichier !");
    }
    return 0;
}


Merci d'avance,
bobspongieux
A voir également:

11 réponses

1000trad Messages postés 2026 Date d'inscription   Statut Membre Dernière intervention   123
 
En fait tu veux mettre ce code en majuscules ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Là, tu convertis plutôt en minuscule avec ton code.
Ensuite, si tu veux récrire dans le fichier, faut le spécifier avec fputs par exemple. Car là, tu convertis juste en minuscule le tableau de caractères.
Cdlt
0
Utilisateur anonyme
 
oui, je voudrais mettre le tout en majuscule.
j'essaye avec un fputc :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define TAILLE_MAX 30

int main()
{
    FILE* fichier = NULL;
    int caractere = 0;
    int i = 0;
    char chaine[TAILLE_MAX] = "";

    fichier = fopen("liste_francais.txt", "r+");

    if (fichier != NULL)
    {
        rewind(fichier);

        while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
        {
            for (i = 0 ; i != '\0' ; i++)
            {
                if (chaine[i] >= 'a' && chaine[i] <= 'z')
                {
                    chaine[i] = chaine[i] - 'a' + 'A';
                    fputc(chaine[i], fichier);
                }
            }
        }

        fclose(fichier);
    }
    else
    {
        printf("Erreur fichier !");
    }
    return 0;
}


ça marche toujours pas... peut-être que je n'ai pas compris le fonctionnement du fputc... qu'utiliseriez-vous, vous ?
merci encore
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ah, j'avais pas vu la première fois. Ta boucle for est fausse.
if(i=0;i!='\0';i++) ne fera aucune itération étant donné que '\0'==0.
La bonne condition serait :
for(i=0;i<strlen(chaine);i++)
en incluant string.h.
Avant, d'écrire, il ne faut pas oublier de revenir au début de la ligne. Sinon tu écriras sur la suivante.
Ensuite, utilise plutôt
fputs(chaine,fichier);
(en le mettant après la boucle de conversion en majuscule bien sûr.
Ce qui donne au final :
#include <stdio.h>
#include <string.h>

#define TAILLE_MAX 30

int main(void)
{
    FILE* fichier = NULL;
    int caractere = 0;
    int i = 0;
    char chaine[TAILLE_MAX] = "";

    fichier = fopen("ahah.txt", "r+");

    if (fichier != NULL)
    {

        while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
        {
            for (i = 0 ; i< strlen(chaine)  ; i++)
            {
                fseek(fichier,-strlen(chaine),SEEK_CUR);
                if (chaine[i] >= 'a' && chaine[i] <= 'z')
                {
                    chaine[i] = chaine[i] - 'a' + 'A';
                }
                fputs(chaine,fichier);
            }
        }

        fclose(fichier);
    }
    else
    {
        printf("Erreur fichier !");
    }
    return 0;
}

Tiens moi au courant si ça marche.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
euh... ça a l'air de marcher mais il semble planter sur les A... o_O
mon fichier original commence par :
Aaron
abaissé
abaissement
abaisser
abandon
etc...
et le fichier modifié donne ça :
AAAAAAAARON
aAAAAAAISSé
aAAAAAAISSé
aAAAAAAISSé
aAAAAAAISSé
aAAAAAAISSé
aAAAAAAISSé
aAAAAAAISSé
aAAAAAAISSé
etc... (toujours la même chose)

je pense qu'il faut utiliser une fonction toupper... je teste et je te dis ça de suite après
0
Utilisateur anonyme
 
ça marche pas avec le toupper, j'ai essayé de faire en sorte que le toupper évite les lettres spéciales et les majuscules mais toujours rien... :

#include <stdio.h>
#include <string.h>

#define TAILLE_MAX 30

int main(void)
{
    FILE* fichier = NULL;
    int caractere = 0;
    int i = 0;
    char chaine[TAILLE_MAX] = "";

    fichier = fopen("liste_francais.txt", "r+");

    if (fichier != NULL)
    {

        while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
        {
            for (i = 0 ; i< strlen(chaine)  ; i++)
            {
                fseek(fichier,-strlen(chaine),SEEK_CUR);
                if (islower(chaine[i]))
                {
                    chaine[i] = toupper(chaine[i]);
                }
                else
                {
                    fseek(fichier, +1, SEEK_CUR);
                }
                fputs(chaine,fichier);
                printf ("%s", &chaine[i]);
            }
        }

        fclose(fichier);
    }
    else
    {
        printf("Erreur fichier !");
    }
    return 0;
}



mais, va-t-on y arriver ? o_O
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
Tu n'as pas besoin d'utiliser "islower". toupper() tout simplement suffit. Il renvoie la lettre majuscule si possible sinon le caractère normal.
Je viens de tester la version que je t'ai donnée. Et elle marche bien sur ma machine. Tu es sur quel OS, tu as créé le fichier texte comment (quel éditeur). Sinon tu peux utiliser putchar(chaine[i]); dans la boucle for pour suivre ce qui se passe petit à petit ;) Ca permettra de localiser le problème plus précisément.
0
Utilisateur anonyme
 
en fait, il faudrait enlever les mots contenants des accents ou des caractères spéciaux pour bien faire mais c'est un peu compliqué... surtout que mes fichiers *.txt contiennent plus de 20 000 caractères (400 pages sous word) et qu'il n'y a aucun moyen de vérifier ensuite.

edit : j'utilise XP et mon fichier est encoder en ANSI
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,
lami20j@debian:~/trash$ cat ccm44_majuscules.c
#include<stdio.h>

int main()
{
        FILE *F,*FF;
        int c;
        if(NULL==(F=fopen("fichier.txt","r")))
                return 1;
        if(NULL==(FF=fopen("fichier_maj.txt","a")))
                return 1;

        while((c=fgetc(F))!=EOF){
                if (c >= 'a'  && c <= 'z')
                        fputc(c - 32,FF);
                else
                        fputc(c,FF);
        }
        fclose(F);
        fclose(FF);
        return 0;
}
0
Utilisateur anonyme
 
euh... il doit y avoir un problème avec mon système ou quelque chose comme ça parce que je vient d'écrire "LoL" sans les guillemets dans un fichier *.txt et il m'a créé un fichier de 150mo avec plein de LLLLLLL dedans a l'exécution du programme o_O
ça peut venir de quoi ?

PS : j'utilise XP et Code:Blocks comme IDE
0
Utilisateur anonyme
 
ça marche avec la solution de lami20j !
merci beaucoup à toi fiddy et biensur merci a lami20j pour cette solution !
a bientot pour de nouvelle aventures,
bobspongieux
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Fallait le dire avant que tu pouvais passer par un autre fichier ^^. Mais bizarre quand même ton problème.
L'essentiel étant le résultat. ;)
0