FILE ARRAY IN C

di il
12 risposte

FILE ARRAY IN C

Salve a tutti... Avrei un problema al riguardo della grande del vettore.. Nel senso che vorrei far determinare la grandezza del vettore durante la lettura del file usando questo ciclo while(fscanf(fp,"%d",&V)!=EOF)
DIM++; però non funziona QUalcuno potrebbe aiutarmi?

/*Si assuma di avere un file denominato “mat.dat” di 10 righe che rappresenti un
array di dieci elementi interi, con ogni elemento memorizzato in una riga.
- Scrivere un programma che
– acquisisca l’array dal file e lo stampi a video.
– stampi a video il valore massimo e minimo dell’array, restituite dalle funzioni:
- int max(int a[], int dim);
- int min(int a[], int dim);*/

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

/*Definizione dei prototipi*/
int max(int a[], int dim);
int min(int a[], int dim);

int main(){
    int V[SIZE],n,i;
    
    FILE *fp;
    fp=fopen("mat.dat","r");
    if(fp==NULL){
        printf("Impossibile aprire il file\n");
        EXIT_FAILURE;
    }
          
      for(i=0; i<=SIZE-1; i++)
      fscanf(fp, "%d", &V[i]);

      for(i=0; i<=SIZE-1; i++)
    printf("%d\n", V[i]);
    
    int Max=max(V,SIZE);
    printf("Il massimo dell'array e' %d\n",Max);

        int Min=min(V,SIZE);
    printf("Il minimo dell'array e' %d\n",Min);
      
      fclose(fp);
      
      return 0;
}

int max(int a[], int dim){
    int i,Mx;
    
    Mx=a[0];
    
  	for (i=0; i<dim; i++) {
  		if(a[i]>Mx){
  			Mx=a[i];
		  }
        }
    
    return Mx;
    }

int min(int a[], int dim){
    int i,Mn;
    
    Mn=a[0];
    
  	for (i=0; i<dim; i++) {
  		if(a[i]<Mn){
  			Mn=a[i];
		  }
        }
                
    return Mn;
}

12 Risposte

  • Re: FILE ARRAY IN C

    Apri il file, usa fgets() per leggere le righe su un buffer e aggiornare una variabile contatore, chiudi e riapri il file

    Oppure usi fseek() se non vuoi chiudere e riaprire

    Quando sai il numero di righe procedi col resto

    https://www.cplusplus.com/reference/cstdio/fgets
    https://www.cplusplus.com/reference/cstdio/fseek
  • Re: FILE ARRAY IN C

    Ma cosa non funziona? Dov'è il ciclo while?
  • Re: FILE ARRAY IN C

    Weierstrass ha scritto:


    Apri il file, usa fgets() per leggere le righe su un buffer e aggiornare una variabile contatore, chiudi e riapri il file

    Oppure usi fseek() se non vuoi chiudere e riaprire

    Quando sai il numero di righe procedi col resto

    https://www.cplusplus.com/reference/cstdio/fgets
    https://www.cplusplus.com/reference/cstdio/fseek
    Grazie mille per l'aiuto
  • Re: FILE ARRAY IN C

    oregon ha scritto:


    Ma cosa non funziona? Dov'è il ciclo while?
    +
    Non avevo inserito il ciclo while perchè non funzionava
  • Re: FILE ARRAY IN C

    Se continui a dire "non funzionava" senza mostrare il ciclo e senza dare dettagli, come vuoi essere aiutato?
  • Re: FILE ARRAY IN C

    L'avevo strutturato in questo modo
    #include <stdio.h>
    #include <stdlib.h>
    #define SIZE 10
    
    /*Definizione dei prototipi*/
    int max(int a[], int dim);
    int min(int a[], int dim);
    
    int main(){
        int V[SIZE],n,i,DIM=0;
        
        FILE *fp;
        fp=fopen("mat.dat","r");
        if(fp==NULL){
            printf("Impossibile aprire il file\n");
            EXIT_FAILURE;
        }
        
              
          for(i=0; i<=SIZE-1; i++){
              while(fgets(fp,100,fp)!=EOF){
                  puts(V);
              DIM++;
              }
          }
    
          for(i=0; i<=DIM-1; i++)
        printf("%d\n", V[i]);
        
        int Max=max(V,DIM);
        printf("Il massimo dell'array e' %d\n",Max);
    
            int Min=min(V,DIM);
        printf("Il minimo dell'array e' %d\n",Min);
          
          fclose(fp);
          
          return 0;
    }
    
    int max(int a[], int dim){
        int i,Mx;
        
        Mx=a[0];
        
      	for (i=0; i<dim; i++) {
      		if(a[i]>Mx){
      			Mx=a[i];
    		  }
            }
        
        return Mx;
        }
    
    int min(int a[], int dim){
        int i,Mn;
        
        Mn=a[0];
        
      	for (i=0; i<dim; i++) {
      		if(a[i]<Mn){
      			Mn=a[i];
    		  }
            }
                    
        return Mn;
    }
  • Re: FILE ARRAY IN C

    Che senso ha racchiudere il ciclo while in quel ciclo for?
    Come mai usi fp due volte? Il primo parametro deve essere il buffer di lettura.
    Il valore restituito dalla fgets è di tipo char * e non può essere EOF. Sarà NULL quando arriva alla fine del file.
    E a cosa ti serve la puts?

    Che ragionamento hai fatto per scrivere questa cosa?
    Perché non hai letto e studiato bene la funzione fgets prima di utilizzarla?

    Per contare le righe devi usare SOLO il ciclo while con un CONTATORE
    
       char buff[100];
       int dim = 0;
       while(fgets(buff,100,fp))
          dim++;
    
    Alla fine la variabile dim conterrà il numero di linee.
  • Re: FILE ARRAY IN C

    Marco topone, scusa la domanda
    ma ti documenti su quello che scrivi o butti giù righe di codice col forcone sperando che prima o poi ci azzecchi?
    lo sai cosa hai scritto qui?
    
        if(fp==NULL){
            printf("Impossibile aprire il file\n");
            EXIT_FAILURE;
        }
    
    cosa che è EXIT_FAILURE secondo te?
  • Re: FILE ARRAY IN C

    Mi associo a Standardoil... fra l'altro questo significa che neanche compili o non leggi gli errori del compilatore e posti subito sul forum.

    Non è un metodo di apprendimento valido.
  • Re: FILE ARRAY IN C

    Ciao, non so se sto scrivendo nella sezione giusta del forum, o se avrei dovuto aprirne un'altra.
    Avrei un problema con un esercizio con un array di caratteri char:
    L'esercizio chiede di creare un programma che, inserita una serie di caratteri compresi tra 'a', 'b' e 'c', controlli che siano "ordinati" (nel senso che ci devono essere prima tutte le 'a', poi tutte le 'b' ecc...) e che sia presente almeno una 'b'. Il tutto mediante una funzione, quindi non direttamente nel main. Il mio problema è che non riesco a confrontare una posizione dell'array con un singolo carattere, la condizione risulta sempre falsa...
    Questo è il codice che ho scritto:
    
    #include <stdio.h>
    
    typedef enum {false, true} boolean;
    
    boolean funz(char v[], int dim);	
    
    int main(){
    	int c, d=5;	
    	char A[d], ch;
    	boolean verifica;
    	for(c=0; c<d; c++){
    		scanf("%c", &ch);
    		if(ch!='\n'){
    			A[c]=ch;
    		}else{
    			c--;
    		}
    	}
    	verifica = funz(A, d);	
    	if(verifica==true){
    		printf("true\n");
    	}else{
    		printf("false\n");
    	}
    	return 0;
    }
    
    boolean funz(char v[], int dim){
    	int i=0, c=0;
    	while((v[i]=='a')&&(i<dim)){
    		i++;
    	}
    	i=c;
    	if(i==dim){
    		return false;
    	}
    	while((v[i]=='b')&&(i<dim)){
    		i++;
    	}
    	if(i==c){
    		return false;
    	}
    	while((v[i]=='c')&&(i<dim)){
    		i++;
    	}
    	if(i!=dim){
    		return false;
    	}else{
    		return true;
    	}
    }
    
  • Re: FILE ARRAY IN C

    La sezione è giusta ma non devi scrivere nel thread di un altro utente. Crearne uno tuo con titolo adeguato o contatta il moderatore
  • Re: FILE ARRAY IN C

    Apri un altro thread.

    Comunque è molto più semplice di quello che stai cercando di fare: devi semplicemente controllare che v[ i ] <= v[i + 1] per tutti gli i e che esista almeno un v[ i ] == 'b'
Devi accedere o registrarti per scrivere nel forum
12 risposte