Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[C] Problème fichiers


Atlante

Messages recommandés

Bonjour,

 

J'ai un petit souci concernant les fichiers. J'essaye de récuperer le contenu d'un fichier (.bin) qui contient des valeurs tels que 200 122 026 655 822

Mon but serait de venir lire ces données pour les stocker dans un tableau pour ensuite les comparer avec un autre tableau. J'arrive à les lire avec la fonction fread (il les lit correctement). Parcontre lorsque je fais ma comparaison entre les deux tableaux ca me sort des valeurs tels que 0 225144 2325514 etc..

 

voici le bout de code qui pose problème :

 

 else if(z == 2){

   k = fopen("C:\\d.bin","r+b");

  //  for(o=1; o<=9; o++)
		fscanf(k, "%d %d %d %d %d %d %d %d %d", tabc[1], tabc[2], tabc[3], tabc[4], tabc[5], tabc[6], tabc[7], tabc[8], tabc[9]);
	   //	 fscanf(k, "%d", &tabc[o-1]);

						   }

je souhaite donc, via fscanf ou autre, recuperer le contenu pour le stocker dans un tableau mais je n'y arrive pas. Si quelqu'un serait m'apporter son aide, merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

un fichier (.bin) qui contient des valeurs tels que 200 122 026 655 822
Stockées sous quelle forme ?

 

J'arrive à les lire avec la fonction fread (il les lit correctement)
Comment le sais-tu ? Comment procèdes-tu (pour les lire, pour les afficher) ?

 

lorsque je fais ma comparaison entre les deux tableaux ca me sort des valeurs tels que 0 225144 2325514
Ta comparaison te "sort" des valeurs ? Comment compares-tu tes tableaux ?

 

fscanf(k, "%d %d %d %d %d %d %d %d %d", tabc[1], tabc[2], tabc[3], tabc[4], tabc[5], tabc[6], tabc[7], tabc[8], tabc[9]);

Comment est défini tabc (int* ou int**) ? Pourquoi tabc[1..9] ici et &tabc[o - 1] dans ton commentaire ? fscanf() prend quoi, déjà, comme paramètres ?

Lien vers le commentaire
Partager sur d’autres sites

Stockées sous quelle forme ?

 

type int

 

Comment le sais-tu ? Comment procèdes-tu (pour les lire, pour les afficher) ?

je lis avec fread mais je n'ai pas mis cette partie du programme étant donnée quelle fonctionne

Ta comparaison te "sort" des valeurs ? Comment compares-tu tes tableaux ?

Je compare comme ca

if (tab[i]<=tabc[8-i] && tab[i]>= tabd[8-i])
			  printf("F %d : %d -> ok\n", (i+1), tab[i]);

Je compare tab avec tabc et tabd. Je n'ai marqué que tabc dans mon message car c'est le meme problème pour tabd

 

fscanf(k, "%d %d %d %d %d %d %d %d %d", tabc[1], tabc[2], tabc[3], tabc[4], tabc[5], tabc[6], tabc[7], tabc[8], tabc[9]);

Comment est défini tabc (int* ou int**) ? Pourquoi tabc[1..9] ici et &tabc[o - 1] dans ton commentaire ? fscanf() prend quoi, déjà, comme paramètres ?

 

tabc est défini en int. Concernant fscanf(FILE * restrict stream, const char * restrict format, ...);

 

Juste une petite précision, je ne pratique pas régulièrement le C j'ai donc quelques souci à retenir ou comprendre certains principe du langage. Certes c'est mon problème mais c'est ce qui fait que je bloque. Merci

Lien vers le commentaire
Partager sur d’autres sites

fscanf lit les données du flux (stream) selon les spécifications de format et affecte les valeurs converties aux arguments qui suivent. Ces derniers doivent être des pointeurs, il faut donc utiliser &tabc[x] pour donner l'adresse.

Lien vers le commentaire
Partager sur d’autres sites

fscanf lit les données du flux (stream) selon les spécifications de format et affecte les valeurs converties aux arguments qui suivent. Ces derniers doivent être des pointeurs, il faut donc utiliser &tabc[x] pour donner l'adresse.

 

J'ai essayé également avec &tabc mais ca ne fonctionne pas. Je pense que le problème vient du faite que dans mon fichier il n'y a pas d'espace entre les chiffres. J'ai par exemple 221200212 dans mon fichier... que j'affiche avec un espace pour avoir 221 200 212... Et comme j'ai cru comprendre que fscanf nécessitait un espace entre chaque valeur c'est probablement pour ça que ca ne fonctionne pas.

Modifié par Atlante
Lien vers le commentaire
Partager sur d’autres sites

pas de séparateur de champs entre les nombres dans le fichier bin ???

 

dans ton format, tu induis le caractère espace comme séparateur

"%d %d %d"

 

tes nombres sont-ils tous à 3 chiffres?

si oui tu peux définir la largeur scannée comme ceci

"%3d%3d%3d"

Lien vers le commentaire
Partager sur d’autres sites

pas de séparateur de champs entre les nombres dans le fichier bin ???

 

dans ton format, tu induis le caractère espace comme séparateur

"%d %d %d"

 

tes nombres sont-ils tous à 3 chiffres?

si oui tu peux définir la largeur scannée comme ceci

"%3d%3d%3d"

 

Non je n'ai pas de séparateur. Effectivement j'ai souvent des nombres composés de 3 chiffres ou 2 parfois, en faite j'ai deux fichiers où les données sont rangés et quand je les lis avec fread j'obtiens :

 

pour le fichier test1 : (je mets un espace pour plus de lisibilité mais dans le fichier il n'y en a pas)

 

40 60 80 100 120 140 160 180 200

 

pour le fichier test2 :

 

21 41 61 81 101 121 141 161 181

 

 

donc dans mon code j'ai mis pour test1 :

 

 else if(z == 2){

   k = fopen("C:\\test1.bin","r+b");
   fscanf(k, "%2d%2d%2d%3d%3d%3d%3d%3d%3d", &tabc[1], &tabc[2], &tabc[3], &tabc[4], &tabc[5], &tabc[6], &tabc[7], &tabc[8], &tabc[9]);
				   }
	fclose(k);

 

et pour test2 :

 

else if(z == 2){

   l = fopen("C:\\test2.bin","r+b");
   fscanf(l, "%2d%2d%2d%2d%3d%3d%3d%3d%3d", &tabd[1], &tabd[2], &tabd[3], &tabd[4], &tabd[5], &tabd[6], &tabd[7], &tabd[8], &tabd[9]);
		}
	fclose(l);

 

Pour ensuite faire le traitement suivant :

 

for (i=0; i<9; i++){

		if (tab[i]<=tabc[8-i] && tab[i]>= tabd[8-i])
			  printf("D %d : %d -> Ok\n", (i+1), tab[i]);							 

		else if (tab[i]>=tabc[8-i])
			  printf("D %d : %d -> Supérieur\n", (i+1), tab[i]);

		else if(tab[i]<=tabd[8-i])
			  printf("D %d : %d -> Inférieur\n", (i+1), tab[i]);

						}

 

tab étant un tableau contenant des valeurs saisies par l'utilisateur

 

Et au final la comparaison ne se fait pas correctement, ca à l'air de marché pour certains mais pas pour d'autre sans que je vois pourquoi. C'est pourquoi, je pense avoir une erreur au niveau du fscanf.

 

Je vous ai mis tous le code (enfin la partie posant problème) pour que vous ayez une meilleur vision de ce que je veux faire. En espérant que ca parle à quelqu'un

Lien vers le commentaire
Partager sur d’autres sites

type int
Ah bon ? Vu le reste des infos que tu fournis, je pense plutôt que tu stockes tes données dans ton fichier sous forme de texte séparé par des espaces. Donc un bon vieux fichier texte et absolument pas un fichier binaire contenant des int.

 

je lis avec fread mais je n'ai pas mis cette partie du programme étant donnée quelle fonctionne
C'est dommage, parce qu'avoir un minimum de contexte aide à réfléchir...

 

Je compare comme ca

if (tab[i]<=tabc[8-i] && tab[i]>= tabd[8-i])
			  printf("F %d : %d -> ok\n", (i+1), tab[i]);

Wow ! "8 - i" pour calculer l'index !? Sais-tu que les tableaux sont indexés de 0 à (taille du tableau - 1) ? J'en déduis donc que tes tableaux n'ont jamais de taille supérieure à 8 ... Alors comment fais-tu pour avoir un tabc[9] sans générer de Segmentation Fault ?

 

tabc est défini en int.
En int[10], tu veux dire ? Parce que si tu déclares tabc en int ça ne peut pas fonctionner...

 

Concernant fscanf(FILE * restrict stream, const char * restrict format, ...);
Certes, mais je posais la question de manière purement rhétorique pour que tu ailles jeter un oeil dans ton K&R et que tu te souviennes que cette fonction attend des pointeurs et non des valeurs. Or, tabc[x] ce n'est pas un pointeur si ton tableau est défini en int[] (ou en int*)... Ca aurait été autre chose en int** (ou en int* [])

 

-- edit --

Attends.... Tu es en train de dire que ton fichier contient les nombres avec les chiffres en vrac sans séparateur ?!?

Et tu t'attends à ce que fscanf retrouve tout seul ceux qui ont deux chiffres et ceux qui en ont trois ?

A vouloir nous donner le moins d'infos possible, tu perds du temps...

Montre-nous le vrai contenu de tes fichiers, stp.

Lien vers le commentaire
Partager sur d’autres sites

Oui les données sont contenues en "vrac" tel que 7090100120140160180200

Effectivement je vois pas comment fscanf va différencier les différentes valeurs si j'ai pas de séparateur :P

Je vais rajouter un espace entre les données

 

Voici l'intégralité de mon code pour info

 

int ajout_f () {
int i, o, p, q, z;
int dsu, dchm=20, dchmi=1, tab[9], tabc[9], tabd[9];

FILE *k;

printf("1. Utiliser les valeurs theoriques ?\n");
printf("2. Utiliser les valeurs modifiees ?\n");
scanf("%d", &z);

if (z == 1) {

	k = fopen("C:\\test1.bin","r+b");

	for (o = 1; o <= 9; o++) {

		dchm += 20;
		tabc[o-1] = dchm;
	}

	fwrite(tabc, sizeof(int), 9, k);
} else if (z == 2) {

	k = fopen("C:\\test1.bin","r+b");
	fscanf(k, "%2d%2d%2d%3d%3d%3d%3d%3d%3d", &tabc[1], &tabc[2], &tabc[3], &tabc[4], &tabc[5], &tabc[6], &tabc[7], &tabc[8], &tabc[9]);

}

fclose(k);

FILE *l;

if (z == 1) {
	l = fopen("C:\\test2.bin","r+b");

	for (p = 1; p <= 9; p++) {

		dchmi += 20;
		tabd[p-1] = dchmi;
	}

	fwrite(tabd, sizeof(int), 9, l);
} else if (z == 2) {

	l = fopen("C:\\test2.bin","r+b");
	fscanf(l, "%2d%2d%2d%2d%3d%3d%3d%3d%3d", &tabd[1], &tabd[2], &tabd[3], &tabd[4], &tabd[5], &tabd[6], &tabd[7], &tabd[8], &tabd[9]);

	fwrite(tabd, sizeof(int), 9, l);
}

fclose(l);

FILE *j;

j = fopen("C:\\test3.bin","ab");

for (i = 1; i <= 9; i++) {

	printf("D %d : ", i);
	scanf("%d", &dsu);
	tab[i-1] = dsu;
}

fwrite(tab, sizeof(int), 9, j);
fclose(j);


FILE *m;

m = fopen("C:\\resultats_f.txt","at");

for (i = 0; i < 9; i++) {
	if (tab[i] <= tabc[8-i] && tab[i] >= tabd[8-i]) {
		printf("D %d : %d -> Ok\n", (i+1), tab[i]);
	} else if (tab[i] >= tabc[8-i]) {
		printf("D %d : %d -> Supérieur\n", (i+1), tab[i]);
	} else if (tab[i] <= tabd[8-i]) {
		printf("D %d : %d -> Inférieur\n", (i+1), tab[i]);
	}
}

fclose(m);
}

 

Le fread est appelé dans une autre partie du programme

Pour test1 et j'ai la même chose pour test2

int lecture_dcf() {
FILE *k;
int i;
int tab2[9];

k = fopen("c:\\test1.bin","rb");

for (i = 1; i <= 9; i++) {
	fread(&tab2[i], sizeof(int), 9, k);
	printf("%d ", tab2[i]);
}

fclose(k);
}

Modifié par KewlCat
mise en forme du code
Lien vers le commentaire
Partager sur d’autres sites

Effectivement, tu vas avoir des soucis avec tes tableaux parce que les index varient entre 0 et (taille - 1), donc un accès à l'index (taille) devrait planter...

Tu travailles sur quelle plate-forme ?

 

Autre remarque...

Tu utilises deux types de fichiers différents, l'un en ACSII l'autre en binaire (l'utilisation de fread() et fwrite() va lire et écrire les données en binaire dans le fichier, et l'utilisation de fscanf() va lire le contenu ASCII du fichier), c'est bien ce que tu avais prévu ?

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...