Besoin aide programmation en c
Résolu
Utilisateur anonyme
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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 :
Merci d'avance,
bobspongieux
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:
- Besoin aide programmation en c
- Application de programmation - Guide
- Mettre en veille un programme - Guide
- Programmer en basic sous windows 10 - Télécharger - Édition & Programmation
- Un autre programme est en cours d'installation - Forum Windows 10
- Programmation envoi sms - Guide
11 réponses
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
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
oui, je voudrais mettre le tout en majuscule.
j'essaye avec un fputc :
ça marche toujours pas... peut-être que je n'ai pas compris le fonctionnement du fputc... qu'utiliseriez-vous, vous ?
merci encore
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
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 :
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
Ce qui donne au final :
Tiens moi au courant si ça marche.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
ç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... :
mais, va-t-on y arriver ? o_O
#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
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.
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.
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
edit : j'utilise XP et mon fichier est encoder en ANSI
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; }
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
ça peut venir de quoi ?
PS : j'utilise XP et Code:Blocks comme IDE