Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C] Array di struct

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    3

    [C] Array di struct

    Buonasera a tutti,

    mi sono appena registrato, seguo questo forum da parecchio tempo per le varie guide, ma ora ho bisogno del vostro aiuto! Sto implementando un programma in C che debba scrivere su file un array di struct. Il problema è il seguente:
    se utilizzo fwrite viene scritto un solo array e anche male sul file e tutto su una riga, mentre se utilizzo fprint la scrittura viene formattata ma ho problemi nel ricercare un elemento.

    Grazie in anticipo.

    Questo è il codice dei 3 moduli del programma.
    main.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "cerca.h"
    #include "marcatore.h"
    #include "menu.h"
    //#include "lettura.h"
    #define N 100
    calciatore inserisci_marcatore(FILE *fp);
    void cerca(FILE *fp, calciatore marcatore[N]);
    int menu(void);
    //void lettura(FILE *fp);
    calciatore marcatore[N];
    int main() {
     FILE *fp;
     int scelta;
     if ((fp = fopen("calcio.txt", "ab+")) == NULL) {
      printf("Il File non può essere aperto");
     }
     else {
      while ((scelta = menu()) != 4) {
       switch (scelta) {
       case 1:
        marcatore[N] = inserisci_marcatore(fp);
        break;
       case 2:
        cerca(fp,marcatore);
        break;
       case 3:
        break;
       default:
        break;
       }
      }
     }
     return 0;
    }

    marcatore.h
    codice:
    #define N 100
    typedef struct { 
     char nome[20], cognome[20], squadra[20];
     int goal; 
    }calciatore;
    
    calciatore inserisci_marcatore(FILE *fp) {
     int i, n;
     calciatore marcatore[N];
     if ((fp = fopen("calcio.txt", "rb+")) == NULL) {
      printf("Il file non esiste");
     }
     else {
      fprintf(fp, "%-19s%-23s%-23s%4s", "Nome", "Cognome", "Squadra", "Goal\n");
      printf("Inserire numero marcatori:");
      scanf("%d", &n);
      for (i = 0; i < n; i++) {
       printf("Inserire nome del marcatore:\n");
       scanf("%s", marcatore[i].nome);
       printf("Inserire cognome del marcatore:\n");
       scanf("%s", marcatore[i].cognome);
       printf("Inserire squadra di appartenenza:\n");
       scanf("%s", marcatore[i].squadra);
       printf("Inserire numero di goal segnati:\n");
       scanf("%d", &marcatore[i].goal);
      }
      for (i = 0; i < n; i++) {
       printf("Prova stampa: marcatore[%d] Nome:%s Cognome:%s Squadra:%s Goal:%d\n", i, marcatore[i].nome, marcatore[i].cognome, marcatore[i].squadra, marcatore[i].goal);
       /*fprintf(fp, "%-19s%-23s%-23s%4d\n", marcatore[i].nome,
         marcatore[i].cognome, marcatore[i].squadra,
         marcatore[i].goal);*/
       fwrite(&marcatore, sizeof(calciatore), 1, fp);
       fseek(fp, sizeof(calciatore), SEEK_CUR);
      }
    
     }
     fclose(fp);
     return(marcatore[N]);
    }
    cerca.h
    codice:
    #include "marcatore.h"
    #define N 100 
    void cerca(FILE *fp, calciatore marcatore[N]) {
     if ((fp = fopen("calcio.txt", "rb+")) == NULL) {
      printf("Il File non può essere aperto");
     } else {
      int flag = 0,i;
      char cercaCognome[20];
      calciatore marcatore[N];
      printf("Inserisci il cognome del calciatore da cercare\n");
      scanf("%s", cercaCognome);
      while (fread(marcatore,sizeof(calciatore), 1, fp)!=0) {
       for (i = 0; i <N; i++{
       fscanf(fp,"%s",marcatore[i].cognome);
        //fseek(fp, sizeof(calciatore), SEEK_SET);
        if ((strcmp(cercaCognome, marcatore[i].cognome)) == 0) {
         flag = 1;
        printf("ECCO IL CALCIATORE CERCATO:");
          printf("Cognome: %s\n", marcatore[i].cognome);
          printf("Squadra: %s\n", marcatore[i].squadra);
          printf("Numero di goal segnati: %d\n", marcatore[i].goal);
        }
        else{
        if (flag == 0) {
         printf(
           "Non esiste nessun calciatore con questo cognome.\n");
        }
        }
       }
      }
     }
     fclose(fp);
    }
    Ultima modifica di Nort; 05-04-2017 a 15:12

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    fprintf scrive i dati in ASCII e quindi questi risulteranno leggibili con un qualsiasi editor. Non vedo perché tu abbia problemi a fare ricerche.

    fwrite scrive in binario e quindi dovrai rileggere in binario con fread.

    Non puoi mischiare le due modalità.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    3
    Quando ricerco ritorna al menu, si ferma al for. Ho provato a leggere con fread, ma non trova comunque nulla ç_ç

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Intanto il codice non si scrive nei file .h ma nei file .cpp.

    Poi vedo che per l'inserimento usi la fwrite e per la lettura la fscanf. Ti ho detto che non devi mischiare le due modalità, se il file è aperto in binario (rb+) devi usare fwrite/fread.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    3
    Grazie mille, ho corretto nella ricerca. Però rimane sempre il problema che scrive solo il primo marcatore, non va avanti, anche se nella printf di test li segnala entrambi inseriti

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ci sono molte incongruenze nel programma. Ad esempio tu indichi un certo numero di record da salvare e poi nella ricerca cerchi di leggerne sempre 100 anche se non esistono.

    E che vuol dire esattamente "non va avanti"?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2017
    Messaggi
    3
    Mi conviene allocarne dinamicamente la dimensione e lavorare con quella?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.