Problème bizarre

Le
iTRiX
Bonjour
Je suis étudiant en informatique et j'ai un petit programme à faire en C++.
J'ai un problème assez étrange dont je suis incapable de trouver la
solution.

Le problème se situe au niveau de la fonction sepchamps. Son rôle est de
séparer les champs selon les * du fichier trans.txt. Voici son contenu :

020104 * Claude Lesage * Portes CLAP * 203456 * 2 *
200.50
080404 *PAULE Thorin* Serres Bulbes* 056753 *12* 5.80
121003* alain provost * Cimenterie Forte * 208935*20*8.55

Il semblerait que, par exemple, lorsque j'appelle cette fonction avec date,
il écrit également dans nom. Lorsque je la lance avec nom, elle écrit
également dans date. C'est peut-être juste une petite erreur mais je ne la
vois pas.

L'exercice consistera plus tard à faire une mise en forme correcte pour
l'affichage mais je ne suis pas rendu là. Le fichier chn.cpp dont on doit se
servir contient des fonctions semblables à celle de string.h. J'ai inclus
son listing à la fin mais je doute que l'erreur provienne de là.

J'espère avoir été assez clair dans mon problème et merci beaucoup à tous
ceux qui prendront de leur temps pour m'aider!! :-)
Note: On utilise le compilateur Borland C++ 5.0

Voici donc le code de mon programme jusqu'à maintenant:
#include <string.h>
#include "chn.cpp"
#include <iostream.h>
#include <fstream.h>
#include <conio.h>

// Variables globales
int tauxtx,lg;
ifstream f;
char ligne[100], date[10], nom[30], fournisseur[45], produit[60],
quantite[85], prixunit[100];

// Prototypes
void liretx();
void ouv();
void lirel();
void traiter();
void sepchamps(char a[]);
void fermer();

// Fonction principale
void main()
{
liretx();
ouv();
lirel();
traiter();
fermer();
}

// Lire le taux de taxe
void liretx()
{
cout << "Veuillez entrer le taux de taxation a appliquer"; cin >> tauxtx;
}

// Ouvrir le fichier
void ouv()
{
f.open("c:\trans.txt",ios::in);
}

// Lire une ligne du fichier
void lirel()
{
f.getline(ligne,100);
}

// Traiter
void traiter()
{
lg=Ch_Longueur(ligne);
sepchamps(date);
sepchamps(nom);
sepchamps(fournisseur);
sepchamps(produit);
sepchamps(quantite);
sepchamps(prixunit);
cout << nom << "" << fournisseur << "" << produit << "" << quantite <<
"" << prixunit << "";
getch();
}

// Séparer les champs de la ligne
void sepchamps(char a[])
{
int k;
k=Ch_Rech(ligne,'*');
Ch_Copie_Nb(a,ligne,k-1);

strrev(ligne);
Ch_Copie_Nb(ligne,ligne,lg-k);
strrev(ligne);
}

// Fermer le fichier
void fermer()
{
f.close();
}


LISTING DE CHN.CPP
//Bibliothèques requises
#include <iostream.h>
#include <conio.h>
#include <string.h>

// Protocoles
void Ch_Init_Nb(char X[], char C, int Nb);
int Ch_Lire_Max(char X[], int Max);
int Ch_Longueur(char X[]);
void Ch_Copie(char CR[], char CE[]);
void Ch_Copie_Nb(char CR[], char CE[], int Nb);
void Ch_Concat(char CR[], char CE[]);
void Ch_Concat_Nb(char CR[], char CE[], int Nb);
int Ch_Rech(char X[], char C);

// Fonction pour initialiser selon un caractère particulier
void Ch_Init_Nb(char X[], char C, int Nb)
{
for(int i=0; i<Nb; i++)
X[i] = C;
X[Nb] = '';
}

// Fonction pour lire une chaîne selon un max de caractère
int Ch_Lire_Max(char X[], int Max)
{
int i=0;
char tmp;
tmp=getche();
while(i<(Max-1) && tmp!)
{
X[i]=tmp;
tmp=getche();
i=i+1;
}

return i;
}

// Fonction pour obtenir la longueur d'une chaîne
int Ch_Longueur(char X[])
{
int i=0;
while(X[i]!='')
{
i=i+1;
}
return i;
}

// Fonction pour copier une chaîne d'une variable à une autre
void Ch_Copie(char CR[], char CE[])
{
int i=0;
while(CE[i]!='')
{
CR[i][i];
i++;
}
CR[i]='';
}

// Fonction pour copier une partie d'une chaîne dans une autre
void Ch_Copie_Nb(char CR[], char CE[], int Nb)
{
int i=0;
while(CE[i]!='' && i<Nb)
{
CR[i][i];
i++;
}
CR[i]='';
}

// Fonction de concaténation
void Ch_Concat(char CR[], char CE[])
{
int k;
k=Ch_Longueur(CR);
Ch_Copie(CR+k,CE);
}

// Fonction de concaténation limitée
void Ch_Concat_Nb(char CR[], char CE[], int Nb)
{
int k;
k=Ch_Longueur(CR);
Ch_Copie_Nb(CR+k,CE,Nb);
}

// Fonction de recherche de caractère
int Ch_Rech(char X[], char C)
{
int Pos=-1;
for(int i=0;i<50;i++)
{
if(X[i]==C)
{
Pos=i;
iP;
}
}
return (Pos+1); //Valeur réelle
}
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #715547
On Thu, 8 Apr 2004 22:05:36 -0400, "iTRiX"
Je suis étudiant en informatique et j'ai un petit programme à faire en C++.


En C ou en C++ ?

// Variables globales


Argh.

int tauxtx,lg;
ifstream f;
char ligne[100], date[10], nom[30], fournisseur[45], produit[60],
quantite[85], prixunit[100];


Je confirme : argh.

Bon, j'imagine que votre prof de C++ vous impose d'utiliser des
chaînes "à la C", i.e. en char[], au lieu d'utiliser des chaînes C++,
std::string. Jusque-là, logique, on va tout de même pas demander à un
prof de C++ d'enseigner le C++.

Mais vous interdit-il aussi de faire appel à la bibliothèque standard
du C ? Je pense en particulier à strtok(), strchr(), strncpy(),
strlen(), etc., qui t'auraient économisé bien des lignes de code.

Pour la réponse à ton problème : imagine que je veuille copier la
chaîne "0123456789" dans date[] ; que se passe-t-il ?


--
;-)
FLL, Epagneul Breton

Alexandre
Le #736681
d'abord un premier conseil : oublies tes variables globales...
A moins qu'elles ne soient imposées par ton prof (ça serait très étrange,
mais bon on voit de tout), c'est une *trsè* mauvaise solution.

// Variables globales
int tauxtx,lg;
ifstream f;
char ligne[100], date[10], nom[30], fournisseur[45], produit[60],
quantite[85], prixunit[100];



Je pense que vous n'avez pas encore vu les classes, ni même les structures
apparement... Sinon il FAUT vous en servir, ici.
Les chaînes "à la C" sont à mon avis indiquées pour des histoires de taille
de champ, non ? Sinon je ne vois pas l'avantage par rapport à std::string
(que vous n'avez peut-être pas vu encore)


// Prototypes
void liretx();
void ouv();
void lirel();
void traiter();
void sepchamps(char a[]);
void fermer();


Ici aussi, les prototypes sont imposés par le prof ? Parce que je comprends
les variables globales : aucun paramètre aux fonctions, aucune valeur de
retour !!!
Bref, de la programmation à deux balles.

Dites, ça fait combien d'heures que le prof a commencé le C++ ? Parce que je
trouve que la POO est très absente de votre exercice (au demeurant fort
simple mais très "C" dans l'esprit)
ça ne m'étonnerait pas si votre prof enseignait le C il y a quelques
années... Il a remplacé printf par cout pour faire du C++, apparament !

Fabien LE LEZ
Le #736680
On Thu, 8 Apr 2004 22:05:36 -0400, "iTRiX"
Le fichier chn.cpp dont on doit se
servir contient des fonctions semblables à celle de string.h.


Gloups... J'avais pas vu ça. Mon dieu mon dieu...

--
;-)
FLL, Epagneul Breton

Fabien LE LEZ
Le #736679
On Fri, 9 Apr 2004 08:11:51 +0200, "Alexandre"

ça ne m'étonnerait pas si votre prof enseignait le C il y a quelques
années... Il a remplacé printf par cout pour faire du C++, apparament !


J'ai la même impression. Et ce qui me désole, c'est le nombre d'élèves
qu'on voit passer ici dans le même cas.

C'est là que je vois à quel point j'ai eu raison de faire des études
de maths : comme la plupart des théories qu'on étudiait datent de plus
d'un demi-siècle, les profs n'avaient pas le problème de mise à niveau
;-)


--
;-)
FLL, Epagneul Breton

Twxs
Le #736468
Fabien LE LEZ wrote:
On Thu, 8 Apr 2004 22:05:36 -0400, "iTRiX"

Le fichier chn.cpp dont on doit se
servir contient des fonctions semblables à celle de string.h.



Gloups... J'avais pas vu ça. Mon dieu mon dieu...



comme tu dis... brrr


void Ch_Init_Nb(char X[], char C, int Nb);
int Ch_Lire_Max(char X[], int Max);
int Ch_Longueur(char X[]);
void Ch_Copie(char CR[], char CE[]);
void Ch_Copie_Nb(char CR[], char CE[], int Nb);
void Ch_Concat(char CR[], char CE[]);
void Ch_Concat_Nb(char CR[], char CE[], int Nb);
int Ch_Rech(char X[], char C);


peut etre qu'en borland y'a un
#define _ ::
;-)

Twxs


iTRiX
Le #736463
"Fabien LE LEZ" news:
On Thu, 8 Apr 2004 22:05:36 -0400, "iTRiX"
Je suis étudiant en informatique et j'ai un petit programme à faire en
C++.



En C ou en C++ ?

// Variables globales


Argh.

int tauxtx,lg;
ifstream f;
char ligne[100], date[10], nom[30], fournisseur[45], produit[60],
quantite[85], prixunit[100];


Je confirme : argh.

Bon, j'imagine que votre prof de C++ vous impose d'utiliser des
chaînes "à la C", i.e. en char[], au lieu d'utiliser des chaînes C++,
std::string. Jusque-là, logique, on va tout de même pas demander à un
prof de C++ d'enseigner le C++.


C'est un prof bizarre...


Mais vous interdit-il aussi de faire appel à la bibliothèque standard
du C ? Je pense en particulier à strtok(), strchr(), strncpy(),
strlen(), etc., qui t'auraient économisé bien des lignes de code.



Oui il veut qu'on utilise les fonctions de traitement des chaînes de
caractères qu'il nous a fait faire (chn.cpp) :-(

Pour la réponse à ton problème : imagine que je veuille copier la
chaîne "0123456789" dans date[] ; que se passe-t-il ?


Elle va être effectivement copiée dans date??



--
;-)
FLL, Epagneul Breton



iTRiX
Le #736461
"Alexandre" news:40763ea3$0$496$
d'abord un premier conseil : oublies tes variables globales...
A moins qu'elles ne soient imposées par ton prof (ça serait très étrange,
mais bon on voit de tout), c'est une *trsè* mauvaise solution.

// Variables globales
int tauxtx,lg;
ifstream f;
char ligne[100], date[10], nom[30], fournisseur[45], produit[60],
quantite[85], prixunit[100];



Je pense que vous n'avez pas encore vu les classes, ni même les structures
apparement... Sinon il FAUT vous en servir, ici.
Les chaînes "à la C" sont à mon avis indiquées pour des histoires de
taille

de champ, non ? Sinon je ne vois pas l'avantage par rapport à std::string
(que vous n'avez peut-être pas vu encore)


Oui, on a vu les classes et les structures mais il faut utilisez ces
variables car c'est plus "simple" selon lui...


// Prototypes
void liretx();
void ouv();
void lirel();
void traiter();
void sepchamps(char a[]);
void fermer();


Ici aussi, les prototypes sont imposés par le prof ? Parce que je
comprends

les variables globales : aucun paramètre aux fonctions, aucune valeur de
retour !!!
Bref, de la programmation à deux balles.


Non, c'est pas imposé mais de la manière qu'il veut ça, c'est des fonctions
void.


Dites, ça fait combien d'heures que le prof a commencé le C++ ? Parce que
je

trouve que la POO est très absente de votre exercice (au demeurant fort
simple mais très "C" dans l'esprit)
ça ne m'étonnerait pas si votre prof enseignait le C il y a quelques
années... Il a remplacé printf par cout pour faire du C++, apparament !



On a commencé à voir la POO mais le prof "veut" qu'on utilise cette méthode
pour ce travail. C'est un très vieux prof. Il enseignait à mon père quand il
était au cégep lui même...


Fabien LE LEZ
Le #736460
On Fri, 9 Apr 2004 11:23:44 -0400, "iTRiX"
C'est un prof bizarre...


Non, un prof assez classique, qui enseigne le C en appelant ça "C++"
parce que ça fait plus moderne.

Pour la réponse à ton problème : imagine que je veuille copier la
chaîne "0123456789" dans date[] ; que se passe-t-il ?


Elle va être effectivement copiée dans date??


A ton avis, comment fait-on rentrer les 11 octets de "0123456789" dans
un tableau de 10 octets ?

--
;-)
FLL, Epagneul Breton


iTRiX
Le #736216
"Fabien LE LEZ" news:
On Fri, 9 Apr 2004 11:23:44 -0400, "iTRiX"
C'est un prof bizarre...


Non, un prof assez classique, qui enseigne le C en appelant ça "C++"
parce que ça fait plus moderne.


En fait, officiellement, c'est un cours de C++ mais des fois il dit C,
d'autres fois, C++.


Pour la réponse à ton problème : imagine que je veuille copier la
chaîne "0123456789" dans date[] ; que se passe-t-il ?


Elle va être effectivement copiée dans date??


A ton avis, comment fait-on rentrer les 11 octets de "0123456789" dans
un tableau de 10 octets ?


Oups, c'est vraiment une erreur stupide de ma part.


--
;-)
FLL, Epagneul Breton




Fabien LE LEZ
Le #736215
On Fri, 9 Apr 2004 11:39:00 -0400, "iTRiX"
En fait, officiellement, c'est un cours de C++ mais des fois il dit C,
d'autres fois, C++.


On va dire que c'est un prof de C+...

--
;-)
FLL, Epagneul Breton

Publicité
Poster une réponse
Anonyme