Svp aider un débutant en C ^^

Svp aider un débutant en C ^^ - C - Programmation

Marsh Posté le 12-04-2005 à 00:33:41    

Bonsoir à toutes et à tous, voilà je suis un débutant en C et je voudrais en fait pourvoir ajouter des données dans un fichier caractérisées par un Nom de film et Un genre du film en question.
J'esseye d'abord avec un VHS et je pense que si celui ci marche, je pourrais adapté pour les autres.^^
 
Est-ce que vous pouvez me dire si ce que j'ai fais pour le moment est juste ou non svp et de corriger si besoin est ?
Merci d'avance. ( J'ai un pb avec mon compilateur C ^^)
 
#include <stdio.h>
#include <stdlib.h>
 
           
typedef struct{
 
    char *nom;
    char *genre;
                             
}FICHE;
 
typedef enum
{
 CatProduitVHS =0,
 CatProduitDVD,
 CatProduitLivre,
 CatProduitCD,
}CatProduit;
 
FILE* OuvrirFichier(CatProduit CategorieProduit)
{
 FILE * tmpFile;  
 
 switch(CategorieProduit)
  {
 
  case CatProduitVHS :
   tmpFile = fopen("vhs.txt","wa" );    
   break;
 
  case CatProduitDVD :
   tmpFile = fopen("dvd.txt","wa" );
   break;
 
  case CatProduitLivre :
   tmpFile = fopen("livres.txt","wa" );
   break;
     
  case CatProduitCD :
   tmpFile = fopen("CDs.txt","wa" );
   break;
 
  default :
   break;
  }
 
 return tmpFile;
}
 
int InsererProduit(FILE * fichierProduit,CatProduit CategorieProduit)
{
 switch(CategorieProduit)
  {
 
  case CatProduitVHS :
   // !!!!! se placer a la fin du fichier !!!!    
 
   // on écrit
   fwrite(&fichierProduit,sizeof(FICHE),1,fichierProduit);
   break;
 
  case CatProduitDVD :
   break;
 
  case CatProduitLivre :
   break;
 
  default :
   break;
  }
 return(1);
 
}
 
void main ()
{
 FICHE *VHS;
 FILE *FichierVHS;
 
 CatProduit Produit = CatProduitVHS;
 
 VHS=(FICHE*)malloc(sizeof(FICHE));
 
 // On ouvre le fichier des VHS
 
 FichierVHS = OuvrirFichier(Produit);
 
 printf("Nom du VHS: " );
 scanf("%c",VHS->nom);
 
 printf("\nGenre : " );
 scanf("%c",VHS->genre);
 
 InsererProduit(FichierVHS,Produit);
 
}

Reply

Marsh Posté le 12-04-2005 à 00:33:41   

Reply

Marsh Posté le 12-04-2005 à 04:43:44    

Bon j'ai la flemme de regarder en détail, mais il y a de grosses erreurs qui sautent aux yeux. Tu as de grosses lacunes, et je te recommande vivement de potasser un bouquin de C (en particulier la notion de pointeurs).
 
1) VHS=(FICHE*)malloc(sizeof(FICHE)); Je le sens mal... D'après quoi que contient le type FICHE ? Si tu penses "deux chaines de caractères", tu as tort.
 
2) scanf("%c",VHS->nom); %c ne lit qu'un caractère, pas une chaine. Et non, %s n'est pas la bonne solution. Utilises fgets, ou getline si la portabilité n'est pas un soucis.
 
3) fwrite(&fichierProduit,sizeof(FICHE),1,fichierProduit); Le premier argument de fwrite doit être l'adresse du buffer qui contient les données à écrire. Ce que tu as écrit n'a aucun sens.
 
4) Globalment il manque un argument à ta fonction InsererProduit... Il faudrait peut-être passer, d'une manière ou d'une autre, les données à écrire ?
 
5) Je passe sur les #include manquant, les test manquants pour les cas d'erreurs et les commentaires à la C++

Reply

Marsh Posté le 12-04-2005 à 09:54:47    

1) si tu veux poster du code, insère-le entre balises \[fixed\] ou \[cpp\] (sans les backslashes)
 
2)

typedef struct{  
 
    char *nom;  
    char *genre;  
                             
}FICHE;


 
Pas bon du tout. Ta structure ne contient que deux pointeurs alors qu'elle devrait contenir deux chaînes. On va pas faire un cours sur les pointeurs, mais pour résumer, une chaîne de caractères est un tableau de "n" octets réservés en mémoire alors qu'un pointeur pointe vers n'importe quelle zone mémoire, même vers une zone où rien ne t'a été réservé.
 
Accessoirement, il est d'usage de réserver les majuscules aux macrodéfinitions et de nommer ses types "t_...." => t_fiche par exemple.
 
3) void main() => main est de type "int"
 
4) l'arguement "wa" de "fopen" m'est inconnu (mais je ne connais pas les subtilités de ton compilo).
Les arguments que je connais
"r" => lecture
"w" => écriture avec réinitialisation du fichier (RAZ)
"a" => ajout (écriture en fin de fichier)
"r+" => lecture et écriture éventuelle
"w+" => écriture avec RAZ et lecture éventuelle
"a+" => ajout et lecture éventuelle
plus la lettre "b" à rajouter quand on travaille dans le monde Windows et qu'on veut travailler sur des fichiers binaires (des fichiers non-texte) => "rb", "wb", "ab", "r+b", "w+b", "a+b"
 
5) Voir les remarques de Matafan


Message édité par Sve@r le 12-04-2005 à 09:55:46
Reply

Marsh Posté le 12-04-2005 à 12:09:31    

Sve@r a écrit :

plus la lettre "b" à rajouter quand on travaille dans le monde Windows et qu'on veut travailler sur des fichiers binaires (des fichiers non-texte) => "rb", "wb", "ab", "r+b", "w+b", "a+b"


Rien à voir avec Windows ou pas. "b" indique toujours et de façon portable que le fichier est binaire (raw), même en unixoïde... Le fait que sous unixoïde, il n'y ait pas de différence visible entre fichiers binaires et fichiers texte est un détail d'implémentation du système Unix, pas une caractéristique du langage C qui n'a que faire du système.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed