PDA

Visualizza la versione completa : [C]aprire file senza il loro nome


Gorgia666
19-07-2009, 10:57
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.

YuYevon
19-07-2009, 11:33
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...

mondobimbi
19-07-2009, 12:10
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

Gorgia666
19-07-2009, 18:02
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.

YuYevon
19-07-2009, 18:41
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



#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.

mondobimbi
19-07-2009, 20:16
fread tratta dati grezzi, qualsiasi essi siano (li legge come sequenza di byte equindi char).

Ho supposto che il tuo file sia del tipo


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



#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

Loading