CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] : Fichiers et liste chainée

GbatouHamm10
GbatouHamm10
Niveau 7
10 février 2007 à 14:09:43

:salut:
Il s´agit juste d´un ptit prob :
Je copie une liste chainée de noms de réalisateur dans un fichier. Voila la fonction

void copie(FILE *fichier, realisateur pp)
{while(pp) {fwrite(pp->real,sizeof(pp->real),1,fichier);
pp=pp->realisateurNext;}
}

Mais le prob, c´est que quand j´affiche le fichier à l´écran, le dernier nom de la liste est affiché 2 fois.

int main()
{FILE *f; char mot[20];
f=fopen("Videotheque.dat","r");
while(!feof(f)) {fread(mot,sizeof(mot),1,f);
printf("%s\n",mot);}
fclose(f);}

Le probleme vient de l´affichage, ou de la copie ?

:merci: de votre aide :)

godrik
godrik
Niveau 30
10 février 2007 à 15:18:40

probablement de la lecture. Tu devrais tester le retour de fread

GbatouHamm10
GbatouHamm10
Niveau 7
10 février 2007 à 15:59:29

:honte: à moi

Merci bcp, suffisait donc juste de mettre :

while(!feof(f) && fread(mot,sizeof(mot),1,f)!=0) printf("%s\n",mot);

Donc la copie de la liste de le fichier était correcte.

godrik
godrik
Niveau 30
10 février 2007 à 16:00:50

et oui, la semantique de feof est qu´il renvoie vrai APRES que l´on ai lu le dernier caractere.

GbatouHamm10
GbatouHamm10
Niveau 7
11 février 2007 à 13:02:47

J´aurais une autre question :

Maintenant, je sais que le fichier contient les bons noms, et je voudrais charger le fichier et mettre son contenu dans une liste chainée.

J´utilise la fonction fgets, car j´ai un nom par ligne.

Ma fonction m´a l´ai correcte, mais je crois que la boucle ne se finit jamais :

while(!feof(f) && fgets(mot,sizeof(mot),f)!=0)

{cour=malloc(sizeof(cour));
strcpy(cour->real, mot);
cour->realisateurNext=pp;
pp=cour; }

return pp;}

Qu´est-ce qui ne va pas ? J´ai repris le meme principe que pour l´ajout d´un nom dans une liste chainée pourtant.

GbatouHamm10
GbatouHamm10
Niveau 7
11 février 2007 à 14:38:59

Desolé pour ce post inutile.
J´viens d´me rendre compte ke j´étais encore + bête que je ne pensais : c´est malloc(sizeof(*cour)) :honte:
J´viens de passer 2h dessus...

m-2
m-2
Niveau 10
13 février 2007 à 01:15:41

petite chose bien bête mais qui est assez utile pour les autres:
essaie de suivre quelque standard de c++.. comme par exemple, le fais de mettre les { } seule sur une ligne, par exemple:

void fonction()
{
...
}

ou bien rajoute quelque espace entre les "=" les "()" ou encore les "!", par exemple:

for (int i= 0; i != 2; ++i)

au lieu de

for(int i=0;i!=2;++i)

ce qui rend le code beaucoup plus visible...!

bon je sais c´est rien mais ca aide toujours...

Fvirtman
Fvirtman
Niveau 10
13 février 2007 à 01:24:14

Gbatouhamm10 > si tu avais un debuggueur sous la main, tu aurais trouvé ton crash en 10 secondes :-)

J´aime le débuggueur, un outil extremement puissant.

GbatouHamm10
GbatouHamm10
Niveau 7
14 février 2007 à 19:29:27

J´ai un debuggeur, le probleme c´est que j´ai jamais essayé d´apprendre à m´en servir ^^ :-(

Sinon, pour les accolades, oui, je ferais ca à la fin quand le programme marchera parfaitement. C´est vrai que c´est + lisible. :ok:

J´ai besoin d´un conseil :

Je vais créer un fichier qui contiendra :
Id_real Id_film Résumé.

Avec Id_real et Id_film 2 entiers.
Résumé est une chaine de caractère de longueur variable, qui peut éventuellement tenir sur plusieurs lignes.

Quelle fonction utiliser pour lire ces 3 variables ?
Ca me gène que la variable Résumé puisse tenir sur plusieurs lignes.
Je sais pas à quel moment le curseur saura que le résumé sera fini.

Si qqn pouvait me conseiller.
:merci:

godrik
godrik
Niveau 30
14 février 2007 à 19:51:41

donne le nombre de caractere qu´il fait.

"Sinon, pour les accolades, oui, je ferais ca à la fin quand le programme marchera parfaitement. C´est vrai que c´est + lisible. :ok: "
En passant, tu as besoin que ton code soit lisible quand tu le débugge, pas quand tu l´as fini...

GbatouHamm10
GbatouHamm10
Niveau 7
14 février 2007 à 20:21:50

La longueur maxi je crois que c´est nous qui décidons.
On peut mettre 5000 caracteres par exemple.
Le prof nous avait conseillés de faire une ligne qui pointait sur une autre, ainsi de suite.

Mais bon, vu que je dois terminer le programme pr demain, j´crois j´vais pas me casser la tete, et je vais faire un fichier par film résumé.
Genre Resume1.dat, Resume2.dat, etc...
Si j´avais eu le w-e j´aurais essayé d´inclure une liste chainée de numéros de lignes dans la structure film.
Mais ca demande trop de temps, enfin pr qqn comme moi :-(

dnob700
dnob700
Niveau 10
15 février 2007 à 10:51:42

ce que veux dire godrik, c´est qu´avant le texte résumé, tu mets le nombre de caractères du texte et comme ça tu sais combien de caractères tu dois relire.

GbatouHamm10
GbatouHamm10
Niveau 7
15 février 2007 à 14:27:06

ok, j´comprend.
Donc il faudrait alors rajouter dans la structure des films la taille du résumé.
Je vais essayer, si ca prend pas longtps.
merci.

GbatouHamm10
GbatouHamm10
Niveau 7
15 février 2007 à 22:01:26

J´aurais encore une question :

pour lire un nom tapé, je fais :
fgets(nom, sizeof(nom), stdin).

Mais comment vérifier que l´utilisateur a bien saisi un nom, et n´a pas juste appuyé sur la touche Enter ?

godrik
godrik
Niveau 30
15 février 2007 à 22:12:35

C´est assez difficile a dire, tu peux striper la chaine (retirer les espace en début et fin) et ensuite verifier si la chaine contient des caracteres.

Fvirtman
Fvirtman
Niveau 10
16 février 2007 à 14:19:19

S´il a juste appuyé sur Enter, tu as strlen(nom) qui vaut 0.

Ou alors nom[0]==0x0A ou nom[0]==0x0D (comprendre les retours a la ligne, donc le enter)

GbatouHamm10
GbatouHamm10
Niveau 7
16 février 2007 à 19:44:02

:merci: bcp pour votre aide les gars :ok:
J´ai enfin rendu le programme. Va falloir que j´progresse en C, mais j´ai le temps, on en fait pas au 2nd semestre.

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment