Lire un fichier - C

Fermé
Chro - Modifié par Whismeril le 12/02/2015 à 19:44
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 14 févr. 2015 à 12:50
Bonjour ce code crée un fichier et permet de modifier son contenu par contre je n'arrive pas à lire le fichier dans la console.
Comment faire ?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define CARACMAX 30

typedef struct programme
{
 char nom[CARACMAX];
 double prix;
}Programme;

void main(void)
{
 Programme excel;
 char nomLu[CARACMAX];
 int prixLu;
 FILE *ptrFichier;

 //Création du fichier
 fopen_s(&ptrFichier, "fichier.dat", "ab+");
 if (ptrFichier == NULL)
 {
  puts("Plus de place");
  exit(1);
 }
 else
 {
  strcpy_s(excel.nom, sizeof(excel.nom), "Excel");
  excel.prix = 108.5;
 }

 //Modification du fichier
 if (ptrFichier == NULL)
 {
  puts("Fichier inexistant");
 }
 else
 {
  fseek(ptrFichier, 0, SEEK_SET);
  printf_s("Nom du programme : \n");
  gets_s(nomLu,CARACMAX);
  int tailleNom = strlen(nomLu) + 1;
  fwrite(&nomLu, tailleNom*sizeof(char), tailleNom, ptrFichier);

  printf_s("Prix du programme = \n");
  scanf_s("%d", &prixLu);
  fwrite(&prixLu, sizeof(double), 1, ptrFichier); 
 }

 //Lecture du fichier
 if (ptrFichier == NULL)
 {
  puts("Fichier inexistant");
 }
 else
 {
  fread_s(&excel, sizeof(Programme), sizeof(Programme), 1, ptrFichier);
 }

 system("pause");
}


EDIT: Ajout de la coloration syntaxique.
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
12 févr. 2015 à 22:28
Bonjour,

void main(void)
Le bon prototype est : int main(void)
Et il ne faut pas oublier le return 0; final.

fopen_s()
Quel est le prototype de la fonction ?
void fopen_s(FILE**, const char*, const char*) ?

exit(1);
Plutôt return EXIT_FAILURE;

gets_s, scanf_s
Quel est le prototype des fonctions ?

fwrite(&nomLu, tailleNom*sizeof(char), tailleNom, ptrFichier);

C'est nomLu qu'il faut mettre et pas &nomLu.

fwrite(&prixLu, sizeof(double), 1, ptrFichier);
prixLu est un int, pas un double...

fread_s(&excel, sizeof(Programme), sizeof(Programme), 1, ptrFichier);
Quel est le prototype de fread_s() ? sizeof(Programme) 2 fois ? Bizarre...

Je te laisse corriger tout ça. Reposte ton code corrigé si le problème n'est pas réglé. N'oublie pas d'utiliser la balise "code c".
Exemple :
<code c>ici tu mets ton code</code>

Cdlt,
0
Il de fait pas de prototype pour gets_s, etc.. elle sont compris dans les libraires que j'ai importé.

Par contre le problème de mon code ce trouve dans ces quelques lignes, le reste fonctionne très bien :
//Lecture du fichier
	if (ptrFichier == NULL)
	{
		puts("Fichier inexistant");
	}
	else
	{
		fread_s(&excel, sizeof(Programme), sizeof(Programme), 1, ptrFichier);
	}

	system("pause"); 
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
14 févr. 2015 à 12:50
Si, il y a forcément des prototypes. Sinon, le compilateur criera...
Tu dois pouvoir le trouver dans le .h que tu inclues.
Et comme nombre de fonctions que tu utilises ne sont pas standards, on ne peut pas te dire si tu les utilises bien ou pas... Donc, il faut vraiment que tu nous trouves ces prototypes.

Note : ce n'est pas parce que le code s'exécute bien ailleurs qu'il est correct. Une erreur peut se déclencher que bien plus tard...

Et au passage, les remarques que j'ai faites (void main(), ...) sont à prendre en compte si tu veux avoir du code standard. Et ce, même si ton code compile...
0