IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lire un fichier, extraire les infos


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Janvier 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Janvier 2013
    Messages : 79
    Par défaut Lire un fichier, extraire les infos
    Bonjour, j'essaie depuis ce matin d'extraire des données de configuration d'un fichier texte.
    Ce fichier comprend pour tester des identifiants à une base de donnée.

    J'ai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	FILE* fichier = NULL;
    	fichier = fopen("config.cnf", "r+");
     
    	char chaine[23] ;
    	char *token;
    	int i = 0;
    	int j = 0;
     
    	char *server;
    	char *user;
    	char *password;
    	char *database;
    	int caractereActuel = 0;
     
    	if (fichier != NULL){
     
    		//fseek(fichier, 1, SEEK_CUR);
     
            do{
                caractereActuel = fgetc(fichier); // On lit le caractère
    			if(caractereActuel == '='){
    			i++;
    				fseek(fichier, 0, SEEK_CUR);
    				fgets(chaine, 20, fichier);
    				switch(i){
    					case 0:
    						server = chaine;
    					break;
    					case 1:
    						user = chaine;
    					break;
    					case 2:
    						password = chaine;
    					break;
    					case 3: 
    						database = chaine;
    					break;
    					default:
    					break;
    				}
    			}
            } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
     
    		printf("%s <br />", server);
    		printf("%s<br />", user);
    		printf("%s<br />", password);
    		printf("%s<br />", database);
     
     
    		fclose(fichier); 
        }

    J'ai essayé de 100 manière différents, a chaque fois c'est le foutoir.
    Mon fichier ressemble a
    ip=localhost
    user=user
    pass=pass
    database=database

    Merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par défaut
    Il faut faire un automate ... comme la machine à café
    Je te laisse chercher avec ton moteur de recherche WEB préféré, mais en gros:

    Si on élimine les espaces et que l'on garde que des caractères minuscules et les fins de lignes:
    On attend soit un i soit un p soit un u soit un d (à moins que les attributs soient dans un ordre précis)

    Si c'est i, on va attendre successivement un p, un = (sinon erreur) et ensuite jusqu'à la fin de ligne on prend tous les caractères -> on a l'ip
    Si c'est p, on va attendre successivement un a, un s, un s, un = (sinon erreur) et ensuite jusqu'à la fin de ligne on prend tous les caractères -> on a le mot de passe

    Et ainsi de suite

    Édit: un automate c'est une machine à état.
    Mais dans ton cas, la programmation objet n'est pas nécessaire.
    Il faut faire des switch dans des switch

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    pas forcément switch switch.
    le fonctionnement de base serait:
    tant qu'on peut lire une ligne {
        s'il n'y a pas un unique '=', sauter la ligne (avec un message?)
        découper chaque ligne autour du '='
        retirer les espaces extérieurs de chaque morceau. (trim...)
        si le premier morceau correspond à une des clés de définition, extraire la valeur du second morceau.
    }
    à toi de coder les fonctions utiles, et de récupérer sur le net des codes pour trim et split.

    L'automate caractère à caractère n'est pas toujours une bonne idée

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par défaut
    Citation Envoyé par leternel Voir le message
    L'automate caractère à caractère n'est pas toujours une bonne idée
    Au moins avec l'automate caractère par caractère, on peut mettre un couple (clef, valeur) sur plusieurs lignes (mais le mieux pour cela c'est d'avoir un caractère fin de ligne)

    Tu oublies de dire (comme moi), qu'en partant du début d'une ligne, il faut mémoriser la position du premier caractère "lettre ou éventuellement chiffre" (CL) et du dernier CL avant l'égal pour le découpage.
    Et de même après l'égal

    Et enfin tu oublies de dire qu'avec ta méthode , il faudra faire des strcmp en "try and retry", avec éventuellement une sélection sur les premiers caractères

    Citation Envoyé par the Hound Voir le message
    Ça me semble un peu brutal comme méthode pour parser un fichier aussi simplement formaté ...
    Et puis imagine la tête du mec qui reprend le code après

    Sinon l'algorithme de leternel est à peu près ce que j'aurais fait.
    ou

    Justement je me demande si tu peux faire le switch sur le caractère courant avant le switch sur l'état, pour compacter l'automate


    Et éventuellement, c'est peut-être du code vite-fait pour dépanner: donc la tronche qu'il a on s'en fiche

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il faut faire un automate ... [...]
    Édit: un automate c'est une machine à état.
    Mais dans ton cas, la programmation objet n'est pas nécessaire.
    Il faut faire des switch dans des switch
    Ça me semble un peu brutal comme méthode pour parser un fichier aussi simplement formaté ...
    Et puis imagine la tête du mec qui reprend le code après

    Sinon l'algorithme de leternel est à peu près ce que j'aurais fait.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    J'aurai bien donné un peu de code, mais je ne connais que la solution C++ (std::getline et istringstream)
    En C, je ne sais plus comment l'écrire, mais j'imagine qu'avec fgets et les fonctions de recherche dans une chaine, on peut s'en sortir.

  7. #7
    Membre confirmé
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Janvier 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Cyberdocumentaliste

    Informations forums :
    Inscription : Janvier 2013
    Messages : 79
    Par défaut
    Super, merci.

    je vais me pencher sur l'algo de leternel

    A plus tard pour les nouvelles,

  8. #8
    Membre actif
    Homme Profil pro
    Admin Unix & Dev Sénior
    Inscrit en
    Mai 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : Admin Unix & Dev Sénior

    Informations forums :
    Inscription : Mai 2003
    Messages : 25
    Par défaut
    Salut,

    A moins d'être en auto-formation, pourquoi refaire la roue !

    Il existe un snippets C qui contient un code complet et documenté pour ce genre de problème !

    Aller, je mache le travail de recherche snip-c.zip

    @+ et bon dev

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Sauf que visiblement, c'est une question de formation.
    Parce que ce problème est assez simple pour qu'un pratiquant du C professionnel connaisse la réponse.
    (je ne suis qu'amateur en C, mais j'ai une certaine habitude du C++, et les algos sont les mêmes)

    Comme en plus notre règlement nous interdit de donner des réponses toutes faites, c'est dommage.

    @JokerAs:
    N'hésite surtout pas à revenir nous montrer ce que tu as fait, pour qu'on te donne nos avis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire les infos d'un tag ID3
    Par patkiller dans le forum Langages de programmation
    Réponses: 12
    Dernier message: 22/02/2025, 00h24
  2. lire un fichier , extraire des paire de mots
    Par étoile de mer dans le forum Débuter
    Réponses: 14
    Dernier message: 30/09/2008, 15h22
  3. Lire un fichier depuis les ressources
    Par Silverstone dans le forum C++
    Réponses: 1
    Dernier message: 02/11/2007, 18h57
  4. [VBA-E]Extraire les infos des cellules
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/04/2006, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo