Есть ли ошибка при записи R-записи в файл »в функции« ResultatdeMouvement »? - PullRequest
0 голосов
/ 24 марта 2019

В упражнении речь идет о заполнении наименований продуктов с указанием их емкости в файле с именем fichierProduit и заполнении движения (импорт и экспорт) этих продуктов в файле с именем fichierMouvment. Заполнив эти 2 файла, я создаю еще один файл fichierdeResultat, чтобы в него можно было записать новую емкость. После некоторой математики, функция, связанная с этим, является ResultatdeMouvement, при отображении Результата отображается только первый продукт.

Я попытался скопировать имя в запись "Resultat" (R), а затем записать его в fichierdeResultat, отображая их в функции AfficheDeProduitApresMouvement. Кажется, отображается только первое имя продукта в файле fichierProduit.

result

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
struct Produit{
char NomP[10] ;
int StockP;
};

struct Mouvement{
char MouveP[10];
int MouveAp;
int MouveV;
};
struct Resultat{
char NomPr[10];
int StockR;
};
//INSERTING NEW PRODUCTS LIST
void SaisirProduits(FILE* ficheierProduit){
struct Produit P;
ficheierProduit = fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FProduit.dat","wb");
char rep;
do {
    fseek(ficheierProduit, 0, SEEK_END);
    printf("Saisir Nom de Produit: ");
    scanf("%9s",&P.NomP);
    printf("Saisir Capacite de Stock de Produit: ");
    scanf("%i",&P.StockP);
    fwrite (&P, sizeof(struct Produit), 1,ficheierProduit);
    if(fwrite!=0){
        printf("\n\Produit Ajoute avec succees !\n\n");
    }
    printf("Voulez Vouz Saisir un autre Produit (O,N): ");
    scanf(" %c",&rep);
    }while(toupper(rep)!='N');
fclose(ficheierProduit);
}
    //INSERTING NEW MOVEMENT LIST
void SaisirMouvement(FILE* fichierMouvment){
struct Mouvement M;
fichierMouvment = fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FMouvment.dat","wb");
char rep;
do {
    fseek(fichierMouvment, 0, SEEK_END);
    printf("Saisir Nom de Produit a Ajouter un mouvement: ");
    scanf("%9s",&M.MouveP);
    printf("Saisir Capacite d'approvisionnement: ");
    scanf("%i",&M.MouveAp);
    printf("Saisir Nombre Vendu de ce Produit: ");
    scanf("%i",&M.MouveV);
    fwrite (&M, sizeof(struct Mouvement), 1,fichierMouvment);
    if(fwrite!=0){
        printf("\n\Mouvement Ajoute avec succees !\n\n");
    }
    printf("Voulez Vouz Saisir un autre Mouvement (O,N): ");
    scanf(" %c",&rep);
    }while(toupper(rep)!='N');
fclose(fichierMouvment);
}
//Function to verify if the Products Exist or not
int VerifierProduitExistouNon(char NomdeProduit[10],FILE* ficheierProduit){
struct Produit P;   ficheierProduit=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FProduit.dat","r+");
int found=0;
while(!feof(ficheierProduit)){
    fread(&P,sizeof(P),1,ficheierProduit);
    if(strcmp(P.NomP,NomdeProduit)==0){
        found=1;
        return found;
    }else if(feof(ficheierProduit) && found==0)
        return found;
}
fclose(ficheierProduit);
}
//Add New Products to the File
void AjouterNouveauProduit(FILE* fichierProduit){
struct Produit P;
fichierProduit=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FProduit.dat","ab+");
printf("Saisir Nom de Nouveau Produit: ");
scanf("%9s",&P.NomP);
if(VerifierProduitExistouNon(P.NomP,fichierProduit)!=0)
printf("\n\nProduit deja Exist Merci de Verifier !\n\n");
else{
printf("\nSaisir Capcite de Stock de Produit:  ");
scanf("%i",&P.StockP);

fwrite (&P, sizeof(struct Produit), 1,fichierProduit);
printf("\nSaisir de nouveau Produit avec Success ! \n");
}
fclose(fichierProduit);
}
//INSERTING NEW MOUVEMENT
void AjouterNouveauMouvement(FILE* fichierMouvment,FILE* fichierProduit){
struct Mouvement M;
fichierMouvment = fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FMouvment.dat","ab+");
printf("Saisir Nom de Produit a Verifier S'il exist: ");
scanf("%9s",&M.MouveP);
if(VerifierProduitExistouNon(M.MouveP,fichierProduit)!=0){
printf("\n\nProduit Exist Ajout de Nouveau Mouvement.....\n\n");
printf("\nSaisir Capcite d'approvisionnement de Ce Produit:  ");
scanf("%i",&M.MouveAp);
printf("\nSaisir Capcite de Vente de Ce Produit:  ");
scanf("%i",&M.MouveV);
fwrite (&M, sizeof(struct Mouvement), 1,fichierMouvment);
if(fwrite!=0){
printf("\nSaisir de nouveau Produit avec Success ! \n");
}
}else{
printf("\n\nCe Produit N existe pas dans le Stock Merci de Verifier ! \n\n");
}
fclose(fichierMouvment);
}  
//TRYING TO FILE THE RESULT FILE 
void ResultatdeMouvement(FILE* ficheierProduit,FILE* fichierMouvment,FILE* fichierResultat){
struct Produit P;
struct Mouvement M;
struct Resultat R;        ficheierProduit=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FProduit.dat","r+");
fichierMouvment=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FMouvment.dat","r+");
fichierResultat=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FResultat.dat","wb");
while(!feof(ficheierProduit)){
    fread(&P,sizeof(P),1,ficheierProduit);
    while(!feof(fichierMouvment)){
        fread(&M,sizeof(M),1,fichierMouvment);
        if(strcmp(P.NomP,M.MouveP)==0){
            strcpy(R.NomPr,P.NomP);
            R.StockR=P.StockP+(M.MouveAp-M.MouveV);
        }
    }
    fwrite(&R,sizeof(R),1,fichierResultat);
}
fclose(ficheierProduit);
fclose(fichierMouvment);
fclose(fichierResultat);
}
void AfficheDeMouvement(FILE* fichierdeMouvement){
struct Mouvement M;
fichierdeMouvement=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FMouvment.dat","r+");
while(fread(&M,sizeof(M),1,fichierdeMouvement)){
    printf("\n\nNom de Produit: %s | approvisionnement= %i | Vente= %i\n\n ",M.MouveP,M.MouveAp,M.MouveV);
}
fclose(fichierdeMouvement);
}
void AfficheDeProduitavantMouvement(FILE* fichierProduit){
struct Produit P;
fichierProduit=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FProduit.dat","r+");
while(fread(&P,sizeof(P),1,fichierProduit)){
    printf("\n\nNom de Produit: %s | Stock Valable = %i \n\n",P.NomP,P.StockP);
}
fclose(fichierProduit);
} 
void AfficheDeProduitApresMouvement(FILE* fichierResultat){
struct Resultat R;
fichierResultat=fopen("C:/Users/Ayoub/Desktop/EX5/EX5/FResultat.dat","r+");
while(fread(&R,sizeof(R),1,fichierResultat)){
    printf("\n\nNom de Produit: %s | Stock Valable Apres Mouvement: %i  \n",R.NomPr,R.StockR);
}
fclose(fichierResultat);
}

//Main
int main()
{   FILE* Produit;//file of the products
    FILE* MouvementdeProduit;//file of the mouvment
    FILE* ResultatdeMouvedeProduit;//file of the result
    AfficheDeProduitavantMouvement(Produit);
    AfficheDeMouvement(MouvementdeProduit);    ResultatdeMouvement(Produit,MouvementdeProduit,ResultatdeMouvedeProduit);
    AfficheDeProduitApresMouvement(ResultatdeMouvedeProduit);
}

1 Ответ

0 голосов
/ 24 марта 2019

Есть много проблем с вашим кодом, некоторые из которых я рассмотрел в комментариях. Я буду / не определить все проблемы. Я просто укажу вам на проблему, о которой вы спрашиваете.

Проблема в том, что вы пропускаете много записей во входном файле, поэтому перед обработкой следующего продукта вы должны перемотать входной файл:

    while(fread(&P,sizeof(P),1,ficheierProduit))
    {
        // You now have a product.
        // Now collect its stock.
        R.StockR= 0;
        *R.NomPr= '\0';
        while(fread(&M,sizeof(M),1,fichierMouvment))
        {
            if(strcmp(P.NomP,M.MouveP)==0){
               strcpy(R.NomPr,P.NomP);
               R.StockR=P.StockP+(M.MouveAp-M.MouveV);
            }
        }
        if (*R.NomPr!='\0') fwrite(&R,sizeof(R),1,fichierResultat);
        // You have now possibly skipped lots of products.
        // So you must rewind the file.
        fseek(fichierMouvment,0, SEEK_SET);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...