Tableau en c, fgets

Qinqin Messages postés 14 Statut Membre -  
Qinqin Messages postés 14 Statut Membre -
Bonjour,

voila mon probleme.Je n'arrive pas à remplir un tableau de manière constante, je m'explique. Je rempli mais le premier indice ne garde pas sa valeur. tab1[i] a la même valeur partout.

Je doit avoir un probleme avec les pointeurs, mais je ne suis pas un specialiste du c donc ca me passe au dessus de la têtet depuis quelques heures.

char temp [10];
int tab1[50];

while (!feof(fichier)){
fgets (temp, 10,fichier);
tab1[i]=temp;
fgets (temp2, 10,fichier);
tab2[i]=temp2;
i=i++;
}

j'ai abrégé le code en gardant ce qui pose probleme,

merci de vos reponses
A voir également:

7 réponses

NookZ Messages postés 2376 Statut Membre 514
 
tab2[i]=temp2;

tab2 est défini?
0
Qinqin Messages postés 14 Statut Membre
 
oui pardon il est definit

char temp [10],temp[2];
int tab1[50],tab2[50];

while (!feof(fichier)){
fgets (temp, 10,fichier);
tab1[i]=temp;
fgets (temp2, 10,fichier);
tab2[i]=temp2;
i=i++;
}

Ce que je recupère dans fichier ce sont des chiffres

2000
15000
400
0
loupius
 
Ce qui pose problème c'est tab1[i]=temp;
tab1[i] est un entier
temp est un pointeur
Evidemment le programme fonctionne mais ce n'est certainement pas ce que tu veux faire.
D'autre part, si le compilateur était bien réglé, tu devrais t'apercevoir que celui-ci râle.
Bon courage.
0
qinqin
 
ben oui malheureusement le compilateur rale, mais quand il rale pas c'est pire...

J'ai essayé toute sorte de trucs mais je ne trouve pas la solution pour le moment.

Soit dit en passant, je recupère la bonne valeur, simplement la dernière valeur est dans tout le tableau.
0
Qinqin Messages postés 14 Statut Membre
 
apparament j'ai trouvé la solution enfin on me l'a donné.

i=i++ n'existe pas en c
i++suffit. je vais essayer ca
0
loupius
 
Si, on peut écrire i = i++;, mais ça ne change rien, c'est comme i++;, mais avec en plus un possible problème d'effet de bord.
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > loupius
 
i = i++ provoque un comportement indéterminé.
Cela n'est pas donc certainement pas équivalent à i++. Donc il ne faut jamais utiliser i=i++.
0
loupius > fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention  
 
Un comportement indéterminé: TOUT A FAIT et c'est bien ce que j'ai précisé: 'problème d'effet de bord'
Je viens d'essayer, avec gcc 4.3.2 c'est équivalent, mais ce n'est pas parce qu'il n'y a pas d'effet de bord.. qu'il en est toujours de même.
Ta conclusion est bonne et plus explicite que la mienne: NE PAS UTILISER.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Qinqin Messages postés 14 Statut Membre
 
damned ca ne marche pas, je vous remet le code avec les test

int i=0;

while (!feof(fichier)){
fgets (temp, 10,fichier);
tab1[i]=temp;
puts (tab1[i]);
fgets (temp2, 10,fichier);
tab2[i]=temp2;
i++;
}
puts (tab1[0]);
puts (tab1[1]);
puts (tab1[2]);

et les test donnent :

1000

1001

1002

1002

1002

1002

1002

alors qu'ils devraient donner

1000
1001
1002
1000
1001
1002

en effet les valeurs recupérées et censées être stockées dans le tableau sont 1000, 1001, et 1002
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Bizarre ton code. Etonnant même que le compilateur ne dise rien.
Et puis tu ne redonnes pas les déclarations des variables temp et tab. On ne sait pas si tu as changé quelque chose ou pas. Et je vois pas pourquoi tu as deux tableaux tab1 et tab2.

Teste le code suivant :
#define MAX 50

char temp[10];
int tab[MAX];

int sz=0;
while (fgets(temp,sizeof temp,fichier)!=NULL && sz<MAX){
    tab[sz]=atoi(temp); /*converti le nombre stocké dans la chaîne temp en int*/
    sz++;
}

for(int i=0;i<sz;i++) {
    printf("%d\n",tab[i]);
}

Si ce n'est pas ce que tu veux, explique pourquoi tu as deux tableaux, redonne leurs déclarations etc.
0
Qinqin Messages postés 14 Statut Membre
 
en fait j'ai dans le fichier dans lequel je vais chercher les infos une alternance de lignes. Je met la première dans un tableau, la deuxième dans un autre tableau, la 3ème dans le premier tableau etc...

J'ai essayé tellement de trucs que je sais plus trop ou j'en suis en fait, donc je doit pas avoir la meilleure methode c'est sur.

avec la methode atoi il me donne une erreur de segmentation

Les declarations des tableaux sont :

int tab1[50], tab2[50];
char temp[10], temp2[10];
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
D'accord, je comprends mieux.
Essaie le code suivant qui correspondre à ce que tu souhaites faire :
#define MAX1 50
#define MAX2 50


char temp[10];
int tab1[MAX1];
int tab2[MAX2];
int num;
int sz1;
int sz2;

num=0;
sz1=sz2=0;
while(fgets(temp,sizeof temp,fp)!=NULL && sz1<MAX1 && sz2<MAX2){
        switch(num){
            case 0:
                tab1[sz1++]=atoi(temp);
                num=1;
                break;
            case 1:
                tab2[sz2++]=atoi(temp);
                num=0;
                break;
        }
}

fclose(fichier),fichier=NULL;

//affichage
for(int i=0;i<sz1;i++)
        printf("%d\n",tab1[i]);

//affichage
for(int i=0;i<sz2;i++)
        printf("%d\n",tab2[i]);

0
Qinqin Messages postés 14 Statut Membre
 
en fait mon probleme est plus une histoire de pointeur, valeur à un pointeur etc...
0