begin process at 2012 05 29 03:25:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Gestion d'entrées/sorties sur fichier


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Gestion d'entrées/sorties sur fichier

mercredi 9 juillet 2003 à 16:47:33 | Gestion d'entrées/sorties sur fichier

macrow

Bonjour,
Voici mon source :



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


//******************************************************************************
//******************************************************************************

struct UnMembre {
int N_IDM;
char Nom [20];
char Prenom [25];
char Adresse[30];
};


//******************************************************************************
//******************************************************************************

char* F_Base_Membres={"c:\\BaseMembres.txt"};
char* F_Compteur_Membres={"c:\\CPTM.txt"};

//******************************************************************************
//******************************************************************************

// indice du tableau de strutures membres
int indice_tableau=0;


//******************************************************************************
//******************************************************************************

// suivi du numéro ID de la structure membre
int numero_membre=999;



//******************************************************************************
//******************************************************************************
//Fonction permettant de connaitre le nombre de ligne d'un fichier

int Compter_Lignes(char* chemin)
{
ifstream fich(chemin);
// Fichier inexistant ou déplacé
if (!fich)
cout<<"fichier "<<chemin<<" introuvable"<<endl;
// Fichier existant, si le fichier est vide, cela compte 1 ligne
int NbrLignes =0;
while( !fich.eof())
{ char temp[256];
fich.getline(temp , 256, '\n');
NbrLignes++;
};

return NbrLignes;
};

//******************************************************************************
//******************************************************************************
// I) Tableau dynamique pour stocker les structures membre
// a) import de la taille du tableau depuis le fichier Base_Membre(Taille_Initial)
// à laquelle je rajoute 10 unités pour permettre la création
// nouvelle de 10 membres
//Taille_Initial_Membres = nombre d'enregistrements contenus dans le fichier
//Taille_Tous_Membres = Taille du tableau pour ranger la totalité des membres
//anciens et futurs

int Taille_Initial_Membres=Compter_Lignes(F_Base_Membres)-1;
int Taille_Tous_Membres=((Taille_Initial_Membres/4)+10) ;
UnMembre* Tableau_Tous_Membres = new UnMembre [Taille_Tous_Membres];


//******************************************************************************
//******************************************************************************
// I) import de fichier

void Import_Membres ( UnMembre tab[], int& indice, int& numero, char* chemin)
{
ifstream fich (chemin, ios::in); //ouverture du fichier
// a) Fichier inexistant ou déplacé
if (!fich)
cout<<"fichier "<<chemin<<" inexistant ou introuvable"<<endl;
int i=0;
cout<<"Taille ini : "<<Taille_Initial_Membres<<endl; //trace
while ( i<(Taille_Initial_Membres/4))
{
fich>>tab[i].N_IDM;
fich>>tab[i].Nom;
fich>>tab[i].Prenom;
/* PROBLEME */ fich>>tab[i].Adresse;
i++;
indice++;
numero++;
};
};


//******************************************************************************
//******************************************************************************
//Taille_Max==Taille_Tous_Membres,
//c'est la taille maxi du tableau de structure membre
//Denier_ID, correspond au denier Numéro ID des structures Membres utilisée,
//cela correspond donc à n_membre

UnMembre Saisir_Ajouter_M ( UnMembre& nouveau, int& indice, int Taille_Max, int& Dernier_ID )
{ while ( indice<Taille_Max )
{ Dernier_ID++;
cout<<"Nom : " ;
cin>>nouveau.Nom ;
cout<<"Prenom : " ;
cin>>nouveau.Prenom;
cout<<"Adresse : " ;
/* PROBLEME */ cin>>nouveau.Adresse;

Tableau_Tous_Membres[indice].N_IDM=Dernier_ID;
Tableau_Tous_Membres[indice].Nom=nouveau.Nom;
Tableau_Tous_Membres[indice].Prenom=nouveau.Prenom;
Tableau_Tous_Membres[indice].Adresse=nouveau.Adresse;

indice++;

cout<<"Souhaitez vous creer une autre fiche (O/N) ?";
char choix1;
cin>>choix1;
if ( choix1=='n' || choix1=='N')
break;
};
};

//******************************************************************************
//******************************************************************************

void Sauver_Membres ( UnMembre tab[], int indice, int Dernier_ID, char* chemin1, char* chemin2)
{ int i=0;
ofstream fich1;
fich1.open(chemin1, ios::out);
while ( i<indice )
{ if ( fich1.good() )
{ fich1<<tab[i].N_IDM<<endl;
fich1<<tab[i].Nom<<endl;
fich1<<tab[i].Prenom<<endl;
/* PROBLEME */ fich1<<tab[i].Adresse;
i++;
}
else
cerr<<"erreur"<<endl;
};
fich1.close();

ofstream fich2;
fich2.open(chemin2, ios::out);

if( fich2.good() )
fich2<<Dernier_ID<<endl;
else
cerr<<"erreur"<<endl;

fich2.close();

};
//trace
void afficher (UnMembre tab[], int indice)
{ for (int i=0 ; i<indice ; i++)
{ cout<<"debut"<<endl;
cout<<tab[i].N_IDM<<endl;
cout<<tab[i].Nom<<endl;
cout<<tab[i].Prenom<<endl;
cout<<tab[i].Adresse<<endl;
cout<<"fin"<<endl<<endl;
};
};
//******************************************************************************
//******************************************************************************





int main()
{
UnMembre nouveau1;

Import_Membres ( Tableau_Tous_Membres, indice_tableau, numero_membre, F_Base_Membres );

afficher (Tableau_Tous_Membres, indice_tableau);

Saisir_Ajouter_M ( nouveau1, indice_tableau, Taille_Tous_Membres, numero_membre );

afficher (Tableau_Tous_Membres, indice_tableau);

Sauver_Membres ( Tableau_Tous_Membres ,indice_tableau, numero_membre, F_Base_Membres, F_Compteur_Membres);

afficher (Tableau_Tous_Membres, indice_tableau);

system("PAUSE");
return 0;
}





Lorsque l'on exécute ce code, il y a des problème dus aux chargement de chaine de caractères comportant des espaces (xxx.getline)..., j'ai noté les champas par // PROBLEME
Si je retire ces champs mon programme fonctionne convenablement dès que je mets l'adresse avec possibilité de saisir de espaces ex. : 11 avene de la republique, cela plante...Pouvez-vous m'aidez?
code fait sous Dev-c++ 4.01
J'ai retiré tous les fich.getline ou cin.getline pour mettre a la place cin>> et fich>>...
Merci
dimanche 13 juillet 2003 à 21:48:37 | Re : Gestion d'entrées/sorties sur fichier

Chouchou182


Salut

1°) Pourquoi t'inclus stdio.h ?

2°) Ton identation est peu lisible. Petits conseils :
-saute plus de lignes
-rajoute des espaces
-met des tabulations
Tu feras de mes conseils ce que tu voudras mais je te les donne quand même

3°) C'est pas nécessaire de mettre un ; a la fin d'une définition de fonction

4°) J'ai tous refait les io disque en c (ça donne en plus une bonne raison d'inclure cstdio). J'ai fait quelques éssais et ça semble marcher...

A++

Chouchou182

PS: Si je me trompe, merci de me faire signe, ça peut être constructif pour moi aussi.

Voilà ma correction : (le fichiercptm.txt ne sert strictement à rien ou alors j'ai pas tout compris)

#include <iostream.h>
#include <stdlib.h>
//#include <fstream.h>
#include <string.h>
#include <stdio.h>


// ******************************************************************************
// ******************************************************************************

struct UnMembre {
int N_IDM;
char Nom [20];
char Prenom [25];
char Adresse[30];
};


// ******************************************************************************
// ******************************************************************************

char* F_Base_Membres={"BaseMembres.txt"};
char* F_Compteur_Membres={"CPTM.txt"};

// ******************************************************************************
// ******************************************************************************

// indice du tableau de strutures membres
int indice_tableau=0;


// ******************************************************************************
// ******************************************************************************

// suivi du numéro ID de la structure membre
int numero_membre=999;

FILE* fptr ; // flux de fichier C (pas C++)

// ******************************************************************************
// ******************************************************************************
//Fonction permettant de connaitre le nombre de ligne d'un fichier

int Compter_Lignes(char* chemin) {
if ( NULL == (fptr = fopen(chemin, "r+") ) ) {
cout << "fichier " << chemin << " introuvable\n" ;
return 0 ;
}

// Fichier existant, si le fichier est vide, cela compte 1 ligne

int NbrLignes = 0 ;
char ctmp ; // tampon pour stocker provisoirement tous les caractères du fichier

while ( !feof(fptr) ) {

fscanf(fptr, "%c", &ctmp) ;

if ( ctmp == '\n' ) NbrLignes++ ;

}

return NbrLignes ;

}

// ******************************************************************************
// ******************************************************************************
// I) Tableau dynamique pour stocker les structures membre
// a) import de la taille du tableau depuis le fichier Base_Membre(Taille_Initial)
// à laquelle je rajoute 10 unités pour permettre la création
// nouvelle de 10 membres
//Taille_Initial_Membres = nombre d'enregistrements contenus dans le fichier
//Taille_Tous_Membres = Taille du tableau pour ranger la totalité des membres
//anciens et futurs

int Taille_Initial_Membres=Compter_Lignes(F_Base_Membres)-1;
int Taille_Tous_Membres=((Taille_Initial_Membres/4)+10) ;
UnMembre* Tableau_Tous_Membres = new UnMembre [Taille_Tous_Membres];


// ******************************************************************************
// ******************************************************************************
// I) import de fichier

void Import_Membres ( UnMembre tab[], int& indice, int& numero, char* chemin)
{

if ( NULL == (fptr = fopen(chemin, "r+") ) ) {
cout << "fichier " << chemin << " introuvable\n" ;
return ;
}

cout << "Taille ini : " << Taille_Initial_Membres << '\n' ;

int i ;

while ( i < (Taille_Initial_Membres / 4) ) {

fscanf(fptr, "%d %s %s", &tab[i].N_IDM, &tab[i].Nom, &tab[i].Prenom) ;

// tentative de résolution du problème
char ctmp ;
int j = 0 ;
while(true) {

fscanf(fptr, "%c", &ctmp) ;
if ( ctmp == '\n' ) break ;
tab[i].Adresse[j++] = ctmp ;

}

tab[i].Adresse[j] = '\0' ;

indice++ ;
numero++ ;

}
}


// ******************************************************************************
// ******************************************************************************
//Taille_Max==Taille_Tous_Membres,
//c'est la taille maxi du tableau de structure membre
//Denier_ID, correspond au denier Numéro ID des structures Membres utilisée,
//cela correspond donc à n_membre

UnMembre Saisir_Ajouter_M ( UnMembre& nouveau, int& indice, int Taille_Max, int& Dernier_ID ) {

while ( indice<Taille_Max ) {
Dernier_ID++;
cout<<"Nom : " ;
cin>>nouveau.Nom ;
cout<<"Prenom : " ;
cin>>nouveau.Prenom;
cout<<"Adresse : " ;

char ctmp ;
int j = 0 ;
while(true) {

scanf("%c", &ctmp) ;
if ( ctmp == '\n' ) break ;
nouveau.Adresse[j++] = ctmp ;

}

nouveau.Adresse[j] = '\0' ;

Tableau_Tous_Membres[indice].N_IDM=Dernier_ID;
Tableau_Tous_Membres[indice].Nom=nouveau.Nom;
Tableau_Tous_Membres[indice].Prenom=nouveau.Prenom;
Tableau_Tous_Membres[indice].Adresse=nouveau.Adresse;

indice++;

cout<<"Souhaitez vous creer une autre fiche (O/N) ?";
char choix1;
cin>>choix1;
if ( choix1=='n' || choix1=='N')
break;
}
}

// ******************************************************************************
// ******************************************************************************

void Sauver_Membres ( UnMembre tab[], int indice, int Dernier_ID, char* chemin1, char* chemin2) {
//{ int i=0;
//ofstream fich1;
//fich1.open(chemin1, ios::out);
if ( NULL == ( fptr = fopen(chemin1, "a+") ) )
return ;

for ( int i = 0 ; i < indice ; i++ ) {

fprintf(fptr, "\n%d\n%s\n%s\n", tab[i].N_IDM, tab[i].Nom, tab[i].Prenom) ;
for ( int j = 0 ; tab[i].Adresse[j] != '\0' ; j++ ) {
fprintf(fptr, "%c", tab[i].Adresse[j]) ;
}

}

//fich1.close();

fclose(fptr) ;

//ofstream fich2;
//fich2.open(chemin2, ios::out);
if ( NULL == ( fptr = fopen(chemin2, "w+") ) )
return ;

//if( fich2.good() )
//fich2<<Dernier_ID<<endl;
//else
//cerr<<"erreur"<<endl;
fprintf(fptr, "%d\n", Dernier_ID) ;

//fich2.close();

fclose(fptr) ;

}

//trace
void afficher (UnMembre tab[], int indice)
{ for (int i=0 ; i<indice ; i++)
{ cout<<"debut"<<endl;
cout<<tab[i].N_IDM<<endl;
cout<<tab[i].Nom<<endl;
cout<<tab[i].Prenom<<endl;
cout<<tab[i].Adresse<<endl;
cout<<"fin"<<endl<<endl;
};
};
// ******************************************************************************
// ******************************************************************************





int main()
{
UnMembre nouveau1;

Import_Membres ( Tableau_Tous_Membres, indice_tableau, numero_membre, F_Base_Membres );

afficher (Tableau_Tous_Membres, indice_tableau);

Saisir_Ajouter_M ( nouveau1, indice_tableau, Taille_Tous_Membres, numero_membre );

//afficher (Tableau_Tous_Membres, indice_tableau);

Sauver_Membres ( Tableau_Tous_Membres ,indice_tableau, numero_membre, F_Base_Membres, F_Compteur_Membres);

afficher (Tableau_Tous_Membres, indice_tableau);

system("PAUSE");
return 0;
}


/*


Lorsque l'on exécute ce code, il y a des problème dus aux chargement de chaine de caractères comportant des espaces (xxx.getline)..., j'ai noté les champas par // PROBLEME
Si je retire ces champs mon programme fonctionne convenablement dès que je mets l'adresse avec possibilité de saisir de espaces ex. : 11 avene de la republique, cela plante...Pouvez-vous m'aidez?
code fait sous Dev-c++ 4.01
J'ai retiré tous les fich.getline ou cin.getline pour mettre a la place cin>> et fich>>...
Merci
*/


Cette discussion est classée dans : int, tableau, char, indice, membres


Répondre à ce message

Sujets en rapport avec ce message

tableau char [ par dingue007 ] Voila je dois faire un prog en C++ : un tableau avec les mois de lannée et quand je tape un chiffre il me sort le mois ! mais je narrive pas a faire l Tableau et char to int [ par Niníel ] Bonjour!J'ai un tableau: chTabStart[64] dans lequel je rentre un nombre dans le format suivant: d_25 pour un nombre décimale par exemple. Donc dans mo lister un tableau de string [ par minet03 ] Soyons bref, je suis en train de bosser sur un code qui liste les srting d'un tableau, seul problème c'est qu'il y a des problèmes !Voici mon code :vo Saisie chaines caractère en boucle en C [ par oim09 ] Voila alors j'ai rencontré un problème que je n'avai jamais rencontrer. Je veu faire une fonction qui rempli un tablaeu avec des chaines de caractères Help.... probleme avec un programme de tri de char [ par ratp ] Es ce que vous pouvez m'aider. j'ai réaliser un programme qui normalement doit permettre de trier les caracteres. mais sa ne marche pas. merci de m'ai Convertir une valeur d'un tableau de char en int [ par impskil ] Bonjour.J'ai un tableau de char: char line[3000];Je veux reccuperer une valeur à l'interrieur du tableau et enssuite la convertir au format int ou dou Convertir tableau int en const char* et inverse [ par samuraijack1412 ] Bonjour,J'ai écrit une application client-serveur. Ils se communiquent par des sockets TCP. Pour envoyer au serveur un tableau d'entier, j'utilise:int Allocation dynamique tableau 2D : erreur de seg [ par noname001 ] Bonjour à tous, [^^happy13] j'aimerais faire appel à vos lumières concernant deux codes. Ils ont tous les deux pour but de créer un tableau 2D dynami combinaisons possibles C(n,k) [ par mervat ] bonjour, je veux faire la combinaison de n entiers, j'ai trouvé ce code dans un forum qui convient à ce que je veux: [code=cpp]#include #include usi Recherche d'un numéro ligne par ligne [ par Vry ] Bonjour, je suis sur un programme en C où j'ai quelques soucis. Je possède un fichier texte où sont déjà entrer des données, je souhaiterai crée un


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales