J'ai besoin d'écrire un programme C pour récupérer les données d'un fichier et les écrire dans un autre fichier, sans utiliser les fonctions définies par l'utilisateur. Mes exigences sont les suivantes:

  • Rechercher les détails des clients par nom.
  • Stockez les données de transaction (montant payé) dans un autre fichier texte.

J'ai fait le code pour rechercher par nom. Mais ça ne marche pas,

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

int main () {
   char name[10], nic[10], mobile[10];
   char fname[10], fnic[10], fmobile[10];
   char choice;
   int amount;
   FILE *cfptr;


   printf("Enter search type  - \n 1. NAME \n 2. NIC \n 3.MOBILE \n ----> ");
   scanf("%c", &choice);

        printf("Enter search text : ");
        scanf("%s", &name);

        cfptr = fopen ("customer.dat", "r");

        while (!feof(cfptr)){

            fscanf(cfptr, "%s %s %s", fname, fnic, fmobile);

            printf("Read Name |%s|\n", fname );
            printf("Read NIC |%s|\n", fnic );
            printf("Read Mobile |%s|\n", fmobile );
   }
   fclose(cfptr);
   scanf("%d", &amount);

   return(0);
}

Fichier customer.dat

Shan    100012  200202
Marsh   121213  667675
Kim     126573  663412

Ce code n'est pas complet car je ne peux pas filtrer l'attribution de nom unique

if(name == fname)

Comme je reçois

affectation à une expression avec une erreur de type de tableau

Quelqu'un peut-il me compléter le code pour rechercher et enregistrer dans un autre fichier afin que je puisse faire la partie calcul du montant?

2
Bubashan_kushan 5 mai 2020 à 07:21

3 réponses

Meilleure réponse
int Search_in_File(char *fname, char *str) {
    FILE *fp;
    int line_num = 1;
    int find_result = 0;
    char temp[512];

    //gcc users
    //if((fp = fopen(fname, "r")) == NULL) {
    //  return(-1);
    //}

    //Visual Studio users
    if((fopen_s(&fp, fname, "r")) != NULL) {
        return(-1);
    }

    while(fgets(temp, 512, fp) != NULL) {
        if((strstr(temp, str)) != NULL) {
            printf("A match found on line: %d\n", line_num);
            printf("\n%s\n", temp);
            find_result++;
        }
        line_num++;
    }

    if(find_result == 0) {
        printf("\nSorry, couldn't find a match.\n");
    }

    //Close the file if still open.
    if(fp) {
        fclose(fp);
    }
    return(0);
}
1
Makwana Prahlad 5 mai 2020 à 08:06

Quelques commentaires:

  1. lors de la numérisation du choix, lisez-le comme un entier et non comme un caractère.
    scanf("%c", &choice); // change to scanf("%d", &choice);
  1. single '=' est une affectation, vous vouliez dire une comparaison qui est double '=='
    if(name = fname) // comparison is if(name == fname)
  1. pour comparer une chaîne, n'utilisez pas l'opérateur '=='. utilisez strcmp ou implémentez un équivalent de strcmp.
1
AEM 5 mai 2020 à 07:12

Merci pour l'effort, comme pour les changements, j'ai changé mon code comme ci-dessous et son fonctionnement. Sans vérifier avec le nom, j'ai vérifié en alternance avec le nic.

#include <stdio.h>
int main(void){
    int nic, n, mobile;
    char name[30]; 
    FILE *aPtr;

    aPtr = fopen("Details.txt","w"); 
    if(aPtr == NULL){
        printf("File cannot be opened");
        return -1;
    }
    printf("Enter nic to search - "); 
    scanf("%d", &n); 
    fscanf(aPtr, "%d %-s %d", &nic, name, &mobile); 

    while(!feof(aPtr)){
        if(nic == n){
            Printf("%d %s %d \n", nic, name, mobile); 
        }
        fscanf(aPtr, "%d %s %d", &nic, name, &mobile); 
    }
    fclose(aPtr); 
    return 0;
}
0
Bubashan_kushan 5 mai 2020 à 07:56