#1 Le 12/03/2023, à 15:46
- alrito
[Résolu] Comment prendre un mot dans un fichier texte existant en C
Bonjour,
Je voudrais savoir pour l'un de mes projets que je fais, comment fait-on pour prendre un mot dans un fichier texte.
Par exemple :
Bonjour,
Je suis heureux d'apprendre à programmer
STOP
Comment fait-on pour prendre le mot "heureux" ?
Dernière modification par alrito (Le 02/04/2023, à 17:22)
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#2 Le 12/03/2023, à 16:54
- claudius01
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Bonjour,
Si le critère répond à : "heureux" est le 3ième mot de la ligne "Je suis heureux d'apprendre à programmer"
Alors parser ladite ligne avec strtok avec comme séparateur le pattern " \n" (espace + line feed)
Dernière modification par claudius01 (Le 12/03/2023, à 17:01)
Hors ligne
#3 Le 02/04/2023, à 14:16
- alrito
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Bonjour,
Tout d'abord, merci de m'avoir répondue et j'ai étudier ce strtok avec attention.
Petite précision, je suis débutant en C donc cela m'a pris pas mal de temps.
Voici ce que j'ai fais:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char texte[]= "Bonjour,\n\nje suis heureux d'apprendre à programmer";
char heu[] = "heureux";
char esp[] = " ";
char r[] = "\n";
char *posi1 = strtok(texte, r);
// printf("%s\n", posi1);
char *posi2 = strtok(NULL, esp);
// printf("%s\n", posi2);
char *posi3 = strtok(NULL, esp);
// printf("%s\n", posi3);
char *posi4 = strtok(NULL, esp);
printf("%s\n", posi4);
exit(EXIT_SUCCESS);
}
En compilant ceci et en executant, on obtient bien :
heureux
Ce que je veux faire avec mon programme c'est :
Rentrer dans mon fichier (FILE *fic = fopen("texte.txt", "r")), puis prendre le contenu du fichier et enfin sélectionner le mot heureux (affiché en résultat).
Comment on fait ?
Dernière modification par alrito (Le 16/08/2023, à 19:59)
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#4 Le 02/04/2023, à 15:08
- iznobe
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Bonjour peut etre grace a l' une de ces fonctions : https://koor.fr/C/cstdio/fprintf.wp
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#5 Le 02/04/2023, à 15:13
- Watael
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
prendre le contenu du fichier et enfin sélectionner le mot heureux
ça dépend de ce que tu cherches.
cherches-tu "heureux" où qu'il soit sur une ligne d'un fichier ?
ou, comme dit précédemment, est-ce le troisième mot d'une ligne ?
ou... ?
edit: et n'existe-t-il qu'une seule fois ?
Dernière modification par Watael (Le 02/04/2023, à 16:15)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#6 Le 02/04/2023, à 16:23
- hotnuma
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Il faut procéder étape par étape, d’abord utiliser strtok de façon récursive pour séparer le texte en mots.
https://koor.fr/C/cstring/strtok.wp
Par exemple :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buffer[] = "Bonjour,\n\nje suis heureux d'apprendre à programmer";
const char *separators = " ,.\n";
char *token = strtok(buffer, separators);
while (token != NULL)
{
printf("%s\n", token);
token = strtok(NULL, separators);
}
return EXIT_SUCCESS;
}
Résultat :
Bonjour
je
suis
heureux
d'apprendre
à
programmer
Xubuntu / GitHub
Hors ligne
#7 Le 02/04/2023, à 16:26
- alrito
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Bonjour à ceux qui viennent d'arrivé,
Je cherche le mot "heureux" ou qu'il soit sur une ligne d'un fichier en une seul fois et je n'ai pas trouver ce qu"il me faut dans fprintf.
Dernière modification par alrito (Le 16/08/2023, à 20:00)
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#8 Le 02/04/2023, à 16:29
- hotnuma
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Deuxième étape chercher le mot "heureux", stopper le recherche quand on l'a trouvé.
Exemple :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buffer[] = "Bonjour,\n\nje suis heureux d'apprendre à programmer";
const char *separators = " ,.\n";
const char *word = "heureux";
char *token = strtok(buffer, separators);
while (token != NULL)
{
if (strcmp(token, word) == 0)
{
printf("%s\n", token);
break;
}
token = strtok(NULL, separators);
}
return EXIT_SUCCESS;
}
https://koor.fr/C/cstring/strcmp.wp
Résultat :
heureux
Xubuntu / GitHub
Hors ligne
#9 Le 02/04/2023, à 17:02
- hotnuma
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Troisième étape lire un fichier :
fopen, fread, fclose :
https://koor.fr/C/cstdio/fread.wp
Exemple :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* file_read(const char *filepath)
{
// open file.
FILE *fp = fopen(filepath, "rb");
if (!fp)
return NULL;
// get file size
fseek(fp, 0, SEEK_END);
unsigned long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
// allocate a buffer of size+1.
char *buffer = (char*) malloc((size+1) * sizeof(char));
// read file.
if (fread(buffer, 1, size, fp) != size)
{
free(buffer);
return NULL;
}
// add null terminating char.
buffer[size] = '\0';
return buffer;
}
int main()
{
const char *filepath = "/home/hotnuma/Downloads/test.txt";
char *result = file_read(filepath);
if (!result)
return EXIT_FAILURE;
printf("%s\n", result);
free(result);
return EXIT_SUCCESS;
}
Il faudra évidemment mettre le bon chemin de fichier dans filepath
Noter l'usage de free pour libérer la mémoire allouée avec malloc.
https://koor.fr/C/cstdlib/malloc.wp
Résultat :
Bonjour,
je suis heureux d'apprendre à programmer.
Xubuntu / GitHub
Hors ligne
#10 Le 02/04/2023, à 17:21
- alrito
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Merci à toi hotnuma.
Avec tout ce que tu as mis, j'ai réussi à faire ceci :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* file_read(const char *filepath)
{
// open file.
FILE *fp = fopen(filepath, "rb");
if (!fp)
return NULL;
// get file size
fseek(fp, 0, SEEK_END);
unsigned long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
// allocate a buffer of size+1.
char *buffer = (char*) malloc((size+1) * sizeof(char));
// read file.
if (fread(buffer, 1, size, fp) != size)
{
free(buffer);
return NULL;
}
// add null terminating char.
buffer[size] = '\0';
return buffer;
}
int main()
{
const char *filepath = "texte.txt";
char *result = file_read(filepath);
const char *separators = " ,.\n";
const char *word = "heureux";
char *token = strtok(result, separators);
while (token != NULL)
{
if (strcmp(token, word) == 0)
{
printf("%s\n", token);
break;
}
token = strtok(NULL, separators);
}
return EXIT_SUCCESS;
}
Résultat :
heureux
Et c'est ce que je recherche.
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#11 Le 02/04/2023, à 17:33
- hotnuma
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Très bien, impec.
Comme je disais il faut libérer la mémoire allouée avec malloc en appelant free.
Donc je modifierais, en testant la valeur de retour de la fonction file_read pour savoir si le fichier a été correctement lu et par la même occasion savoir si on a un buffer alloué en mémoire avec malloc.
char *result = file_read(filepath);
if (!result)
return EXIT_FAILURE;
Et donc, appeler free avant de sortir du programme.
free(result);
return EXIT_SUCCESS;
Exemple :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* file_read(const char *filepath)
{
// open file.
FILE *fp = fopen(filepath, "rb");
if (!fp)
return NULL;
// get file size
fseek(fp, 0, SEEK_END);
unsigned long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
// allocate a buffer of size+1.
char *buffer = (char*) malloc((size+1) * sizeof(char));
// read file.
if (fread(buffer, 1, size, fp) != size)
{
free(buffer);
return NULL;
}
// add null terminating char.
buffer[size] = '\0';
return buffer;
}
int main()
{
const char *filepath = "/home/hotnuma/Downloads/test.txt";
char *result = file_read(filepath);
if (!result)
return EXIT_FAILURE;
const char *separators = " ,.\n";
const char *word = "heureux";
char *token = strtok(result, separators);
while (token != NULL)
{
if (strcmp(token, word) == 0)
{
printf("%s\n", token);
break;
}
token = strtok(NULL, separators);
}
free(result);
return EXIT_SUCCESS;
}
Vla
Xubuntu / GitHub
Hors ligne
#12 Le 02/04/2023, à 17:42
- alrito
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Ok
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#13 Le 02/04/2023, à 17:54
- Watael
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
et, tu vas laisser la valeur en dur dans ton code, ou tu vas chercher à la passer en argument à l'exécutable ?
Dernière modification par Watael (Le 02/04/2023, à 17:55)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#14 Le 02/04/2023, à 19:36
- alrito
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Je vais voir
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#15 Le 02/04/2023, à 21:44
- hotnuma
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
J'ai oublié fclose
// add null terminating char.
buffer[size] = '\0';
fclose(fp);
Exemple :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* file_read(const char *filepath)
{
// open file.
FILE *fp = fopen(filepath, "rb");
if (!fp)
return NULL;
// get file size
fseek(fp, 0, SEEK_END);
unsigned long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
// allocate a buffer of size+1.
char *buffer = (char*) malloc((size+1) * sizeof(char));
// read file.
if (fread(buffer, 1, size, fp) != size)
{
free(buffer);
return NULL;
}
// add null terminating char.
buffer[size] = '\0';
fclose(fp);
return buffer;
}
int main()
{
const char *filepath = "/home/hotnuma/Downloads/test.txt";
char *result = file_read(filepath);
if (!result)
return EXIT_FAILURE;
const char *separators = " ,.\n";
const char *word = "heureux";
char *token = strtok(result, separators);
while (token != NULL)
{
if (strcmp(token, word) == 0)
{
printf("%s\n", token);
break;
}
token = strtok(NULL, separators);
}
free(result);
return EXIT_SUCCESS;
}
Vla, c'est mieux.
Xubuntu / GitHub
Hors ligne
#16 Le 04/06/2023, à 15:06
- alrito
Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C
Bonjour hotnuma,
Merci
Dernière modification par alrito (Le 16/08/2023, à 20:01)
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne