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 :

Modifier un fichier sans passer par tableaux ou listes chainées


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Par défaut Modifier un fichier sans passer par tableaux ou listes chainées
    Bonjour, j'aimerai compter les mots d'un fichier texte "test.txt" (dans mon programme) où les mots sont une suite de caractères ASCII délimité par des espaces puis les écrire dans un fichier de sortie (pour moi "out.txt") le but de mon programme est de regarder le mot du texte, le chercher dans mon fichier de sortie voir s'il y est déjà, s'il y est pas on l'écrit avec son occurrence (donc 1 initialement), s'il y est déjà, je passe par un fichier copy.txt qui est la copie de out.txt où je change l’occurrence du mot déjà présent par 2 par exemple s'il était déjà présent une fois.

    Voici mon code
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <assert.h>
     
    int cherche_fichier(char *s, char *chemin){
    	char string[1000];
    	int nb = 1;
    	int q = 0;
    	FILE *original = NULL;
    	FILE *copy = NULL;
     
    	original = fopen (chemin, "r");
    	copy = fopen ("copy.txt", "w+");
    	if (original != NULL){
    		while(fscanf(original, "%1000s %d", string,&nb) > 0) {
    			printf("s = %s et string = %s\n",s, string);
    			if (strcmp(s,string) == 0){
    				fprintf(copy, "%s %d ",string,nb+1);
    				q = 1;
    				printf("lol");
    				break;}
    			fprintf(copy, "%s %d ",string,nb);}}
    	fclose(original);
    	fclose(copy);
    	return q;
    }
     
     
    void lire_mot(char * chemin){
    	char s[1000];
    	int i;
    	int q;
    	FILE *out = NULL;
    	FILE *fichier = NULL;
     
    	fichier = fopen (chemin, "w+"); 				//argv[1]
    	if (fichier != NULL){
    		fputs("Jaime les litchis, mais c'est mo8ins \nbon que les \npeches",fichier); 	//écrit dans le fichier pour le test
    		rewind(fichier); 						// remet le curseur au début
    		while(fscanf(fichier,"%1000s ", s) > 0) {
    			i=0;
    			while( s[i] ) {						//b--met en minuscule le mot 
    				s[i]= tolower(s[i]);
    				if ((int)s[i] >= 48 && (int)s[i] <= 57){
    					printf("nombre");}
    				i++;}printf("\n");				//f--
    			printf("s : %s\n",s);
    			q  = cherche_fichier(s, "out.txt");
    			if (q == 0){
    				out = fopen ("out.txt", "a+");
    				fprintf(out, "%s 1 ",s);
    				fclose(out);}}} 	
    	fclose(fichier);
    }
     
     
     
    int main(int argc, char *argv[]) {
     
    	lire_mot("test.txt");
     
    	return EXIT_SUCCESS;
     
    }
    dans ce cas précis mon fichier copy.txt son contenu devrait être exactement "jaime 1 les 2 litchis, 1 mais 1 c'est 1 mo8ins 1 bon 1 que 1 peches 1 " cependant ma sortie n'est pas vraiment ce que j'espérais.
    Je n'arrive pas vraiment à savoir vraiment où est le problème et si je m'y prends mal.Merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Qu'espérais-tu ? Détaille l'erreur, le comportement rencontré qui pose problème.

    Quelle est la raison qui justifie la non-utilisation d'une collection (tableau, arbre, liste..) ? Sans compter que présentement tu ouvres et relis ton fichier de destination à chaque mot trouvé !?

    Remarque générale : essaie déjà de déléguer les responsabilités de tes fonctions. Actuellement elles font tout et n'importe quoi : de l'entrée / sortie (ouverture / fermeture, lecture de fichier..), de l'analyse de chaîne.. sauf la pauvre fonction main qui elle pour le coup ne fait rien. Distingue les opérations et sépare-les. Indente bien ton code, saute des lignes, insère des espaces, c'est gratuit et tu y verras plus clair.

    Remarque annexe : essaie de directement manipuler le moins possible le contenu des chaînes. Use et abuse des facilités de la bibliothèque standard (isspace, ispunct..).

  3. #3
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Bonjour,

    Comme l'a fait remarquer Matt Houston, c'est​ probablement une mauvaise idée de ne pas utiliser de structure de donnée car cela te force à parcourir le fichier écriture à chaque mot ce qui est très mauvais niveau performance.

    Pourquoi ne voulais-tu pas en utiliser ? C'était une demande d'un enseignant ? Un souhait d'optimiser en mémoire ? Si c'est la deuxième option je te conseille de regarder du côté des filtres de Bloom.

    Donne nous plus de précisions pour que nous puissions t'aiguiller de manière plus précise.

Discussions similaires

  1. [2.x] Upload de fichier sans passer par l'entity
    Par dyron dans le forum Symfony
    Réponses: 5
    Dernier message: 29/11/2012, 17h15
  2. Upload de fichier sans passer par FTP
    Par Invité(e) dans le forum Applets
    Réponses: 2
    Dernier message: 06/06/2008, 11h16
  3. upload d'un fichier sans passer par <input type=file
    Par al3alwa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 31/05/2007, 17h48
  4. Réponses: 15
    Dernier message: 22/02/2007, 11h30
  5. Modifier une valeur dans un fichier sans passer par l'éditeur
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 09/06/2006, 00h15

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