Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C]aprire file senza il loro nome

    Avrei alcune di domande da rivolgervi per un semplice programma in c:

    - E' possibile aprire i file contenuti in una cartella conoscendo solo l'estensione e la destinazione della cartella?

    - c'è un modo più veloce per trovare il massimo di un vettore che scorrerlo tutto con degli if dentro un for (non mi interessa ordinarlo)?

    - Se avessi un file contenente interi ascii, uno per riga numero di righe noto, e volessi leggerli più velocemente che con un fscanf dento un for, come posso fare?

    Grazie per le risposte e i suggerimenti.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    1) scusami se non ho capito, ma intendi dire aprire tutti i file di una cartella che hanno una particolare estensione conoscendo la directory di lavoro? Se è così, sì è possibile ma dipende da compilatore e piattaforma di sviluppo perché non esistono librerie standard per la gestione delle directory.

    2) dipende da cosa intendi per "più veloce"... da un punto di vista teorico, esiste un algoritmo per la ricerca del massimo in un array basato sulla tecnica del "divide et impera" a complessità temporale asintotica O(logn), inferiore a quella dell'algoritmo classico iterativo a complessità O(n) e quindi risulterebbe più rapido (ovviamente n è il size dell'array). Da un punto di vista pratico, invece, poiché la ricorsione richiede un overhead maggiore rispetto ad un semplice programma iterativo, per vettori di "pochi" elementi non conviene... (quantificare il termine "pochi" è difficile, di certo comunque per poche decine di elementi sarebbe sconveniente)

    3) non credo ci sia un modo, aspetta eventuali altre risposte...
    every day above ground is a good one

  3. #3
    se tu sai esattamente come è strutturato il file puoi accelerare molto il processo di lettura.

    Se per esempio il tuo codice ascii è memorizzato come char seguito da un byte di ritorno carrello ti puoi creare una struttura

    struct data {
    char ascii;
    char RC;
    };

    e leggere il file tutto di un botto con read o fread.
    Supponi di avere il file in un buffer letto con read o fread ottieni
    struct data * miei_dati = (struct data * ) buffer;

    ed il terzo ascii memorizzato lo recuperi come

    miei_dati[2].ascii;

    se il ritorno riga è in formato windows (sequnza RC LF) la tua struttura diventerà
    struct data {
    char ascii;
    char RC[2];
    };

    e così via
    ciao
    sergio

  4. #4
    Anzitutto grazie per le risposte.
    X YuYevon
    I miei array vanno da 16X16 a 64X64. Tragicamente sono delle matrici, ma il cuore del codice era troppo più intuitivo così. Mi potresti suggerire come si chiama l'algoritmo o inviarmi un link? grazie
    X mondobimbi
    ci ho pensato ma fread non è solo per l'input binario? Pensavo che con un txt non si potesse usare o almeno non convenzionalmente, comunque provo. Grazie.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Gorgia666
    I miei array vanno da 16X16 a 64X64. Tragicamente sono delle matrici, ma il cuore del codice era troppo più intuitivo così. Mi potresti suggerire come si chiama l'algoritmo o inviarmi un link? grazie
    Ora che ho ricontrollato, quello di cui parlavo io era per determinare simultaneamente sia il minimo che il massimo di un array... in quel caso conviene ricorrere ad un algoritmo ricorsivo, ma per determinare il solo massimo temo che sia la stessa cosa della soluzione iterativa classica, e che io ricordi non esiste un algoritmo migliore. Per curiosità, è una domanda che ti sei posta tu o è qualche esercizio che devi risolvere? In ogni caso una veloce implementazione dell'algoritmo ricorsivo sarebbe

    codice:
    #define MAX(a, b) ( a > b ) ? (a) : (b)
    
    int findMax(int *vect, int n)
    {
    	if ( n == 1 )
    		return vect[0];
    	if ( n == 2 )
    		return MAX(vect[0], vect[1]);
    
    	if ( ! ( n % 2 ) ) /* caso n pari */
    		return MAX(findMax(vect, n/2), findMax(vect + n/2, n/2));
    	else /* caso n dispari */
    		return MAX(findMax(vect, n/2), findMax(vect + n/2, n/2 + 1));
    }
    che riceve in input semplicemente l'array e la sua lunghezza. Se stai trattando matrici, o cerchi di adattarlo oppure gestisci una matrice come un array (si può fare facilmente ricordando che in C l'allocazione delle matrici avviene per righe in celle di memoria contigue) e in tal caso andrebbe sempre bene quest'algortimo, ma ripeto non è più efficiente di quello classico iterativo.
    every day above ground is a good one

  6. #6
    fread tratta dati grezzi, qualsiasi essi siano (li legge come sequenza di byte equindi char).

    Ho supposto che il tuo file sia del tipo
    codice:
    A
    B
    C
    D
    E
    F
    dove dopo il carattere c'è un ritorno a capo RC=\n

    prova a salvarlo come miofile ed esegui questo frammento di programma

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
    
    	struct data {
    		char ascii;
    		char RC;
    	};
    
    	int i;
    
    	FILE * pFile;
    	long size;
    	char * buffer;
    	size_t result;
    
    	pFile = fopen ( "miofile" , "rb" );
    	if ( !pFile) { 
    		fputs ("File error",stderr);
    		exit (1);
    	}
      // ottiene la lunghezza del file
      fseek (pFile , 0 , SEEK_END);
      size = ftell (pFile);
      rewind (pFile);
    
      // alloco la memoria per contenere tutto il file
      buffer = (char*) malloc ( sizeof( char ) * size );
      if ( !buffer ) {
    		fputs ("Errore di memoria", stderr);
    		exit (2);
    	}
    
    	// copia il fila in buffer:
    	result = fread (buffer, 1, size, pFile);
    	if ( result != size) {
    		fputs ("Errore di lettura del file", stderr);
    		exit (3);
    	}
    
    	/* tutto il file è in memoria */
    
    	fclose (pFile);
    
    	struct data * miei_dati = (struct data * ) buffer;
    	for ( i = 0; i < size / sizeof( struct data ); i++ ) {
    		printf("%d %c%c", i, miei_dati[i].ascii, miei_dati[i].RC);
    	}
    		
    
    	free (buffer);
    
    }
    se usi windows ed il file lo generi con un editore tipo wordpad forse il ritorno a capo lo fa con la sequenza LF RC e quindi devi un pochino modificare la logica.
    ciao
    sergio

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 © 2025 vBulletin Solutions, Inc. All rights reserved.