Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/03/2023, à 16: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, à 18:22)


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#2 Le 12/03/2023, à 17: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, à 18:01)

Hors ligne

#3 Le 02/04/2023, à 15: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, à 20:59)


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#4 Le 02/04/2023, à 16: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 utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 02/04/2023, à 16: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, à 17:15)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 02/04/2023, à 17: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, à 17: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, à 21:00)


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#8 Le 02/04/2023, à 17: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, à 18: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 tongue

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, à 18: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.


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#11 Le 02/04/2023, à 18:33

hotnuma

Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C

Très bien, impec. tongue

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 tongue


Xubuntu / GitHub

Hors ligne

#12 Le 02/04/2023, à 18:42

alrito

Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C

Ok tongue smile


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#13 Le 02/04/2023, à 18: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 ? wink

Dernière modification par Watael (Le 02/04/2023, à 18:55)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 02/04/2023, à 20:36

alrito

Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C

Je vais voir smile


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#15 Le 02/04/2023, à 22:44

hotnuma

Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C

J'ai oublié fclose tongue

    // 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. tongue


Xubuntu / GitHub

Hors ligne

#16 Le 04/06/2023, à 16:06

alrito

Re : [Résolu] Comment prendre un mot dans un fichier texte existant en C

Bonjour hotnuma,

Merci smile

Dernière modification par alrito (Le 16/08/2023, à 21:01)


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne