Domanda

appena avuto una domanda di carattere generale su come affrontare un certo problema che sto affrontando. Sono abbastanza nuovo per C in modo da portare con me qui. Dire che ho una cartella con i file di testo 1000+, i file non vengono denominati in qualsiasi tipo di ordine numerato, ma sono alfabetico. Per il mio problema che ho i file di dati di stock, ogni file prende il nome rispettivo ticker della società. Voglio scrivere un programma che si aprirà ogni file, leggere i dati trovano il minimo storico e confrontarlo con il prezzo corrente e calcolare la variazione percentuale, e quindi stamparlo. La ricerca e il calcolo non sono un problema, il problema è sempre il programma di passare attraverso e aprire ogni file. L'unico modo che posso vedere per attaccare questo è quello di creare un file di testo contenente tutti i simboli ticker, avendo il programma di leggere che in un array e quindi eseguire un ciclo che prima apre il primo nome nella matrice, eseguire i calcoli, stampa l'uscita, chiudere il file, quindi loopback intorno spostando al secondo elemento (il simbolo successivo ticker) nella matrice. Questo sarebbe abbastanza semplice da configurare (credo) ma mi piacerebbe davvero evitare di scrivere fuori oltre un migliaio di nomi di file in un file di testo. C'è un modo migliore per avvicinarsi a questo? Non proprio per chiedere il codice (a meno che non ci sia qualche funzione sorprendente in c che farà questo per me;).), Solo qualche consiglio da più esperti programmatori C

Grazie:)

Modifica: Questo è su Linux, scusate ho dimenticato di metion che

È stato utile?

Soluzione

Sotto Linux / Unix (BSD, OS X, POSIX, etc.) è possibile utilizzare opendir / readdir di passare attraverso la struttura delle directory. Non c'è bisogno di generare file statici che devono essere aggiornati, quando il file system ha le informazioni desiderate. Se si desidera solo un sottoinsieme delle scorte in un dato momento, quindi utilizzando glob sarebbe più veloce, c'è anche scandir .

Non so quali funzioni Win32 (Windows / Platform SDK) sono chiamati, se si sta sviluppando utilizzando Visual C ++ come il compilatore C. Cercando MSDN Library dovrebbe aiutare.

Altri suggerimenti

Supponendo che si sta eseguendo su linux ...

ls /path/to/text/files > names.txt

è esattamente ciò che si desidera.

Non ci sono funzioni in C standard che hanno alcuna nozione di "directory". Sarà necessario utilizzare una sorta di funzione di specifico per la piattaforma per fare questo. Per alcuni esempi, dare un'occhiata a questo post da Cprogrammnig.com .

Personalmente, io preferisco usare l'approccio opendir() / readdir() come mostrato nel secondo esempio. Esso funziona in modo nativo sotto Linux e anche su Windows se si utilizza Cygwin.

Approccio 1) Vorrei solo avere una directory specifica in cui ho solo questi file contenenti i dati ticker e nient'altro. Vorrei quindi utilizzare il C readdir API per elencare tutti i file nella directory e iterare ognuno di eseguire il trattamento dei dati di cui avete bisogno. Quale Ticker il file applica a è determinato solo dal nome del file.

Pro: Facile da codice

Contro:. E 'davvero dipende in cui i file sono memorizzati e da dove vengono

Approccio 2) Modificare il formato del file in modo che i file ticker iniziano con un codice magico identificazione che questo è un file ticker, e una stringa contenente il nome. Come prima dell'uso readdir per scorrere attraverso tutti i file nella cartella e aprire ogni file, assicurarsi che il numero magico è impostato e lesse il nome ticker dal file, ed elaborare i dati come prima

Pro: Più flessibile rispetto a prima. Nome file non deve necessariamente riflettere nome del ticker   Contro:. Più difficile da codice, formato di file può essere fisso

  

ma mi piacerebbe davvero evitare di scrivere fuori oltre un migliaio di nomi di file in un file di testo. C'è un modo migliore per avvicinarsi a questo?

Ho risolto il problema esattamente lo stesso un po 'indietro, anche se per uso personale:)

Quello che ho fatto è stato quello di utilizzare i comandi della shell del sistema operativo per generare un elenco di questi file e reindirizzato l'output in un file di testo ed era il mio programma di correre attraverso di loro.

In pseudo codice sarebbe simile a questa, che non so definire il codice come io non sono al 100% sicuro se questo è l'approccio corretto ...

for each directory entry
    scan the filename
         extract the ticker name from the filename
         open the file
              read the data
              create a record consisting of the filename, data.....
         close the file
         add the record to a list/array...
> sort the list/array into alphabetical order based on 
  the ticker name in the filename...

Si potrebbe variare leggermente se lo si desidera, eseguire la scansione dei nomi di file nelle voci di directory e ordinarli prima con la costruzione di un record con i nomi dei file prima, per poi tornare al punto di partenza della lista / array e aprire ognuno leggere individualmente il dati e la messa in record poi ....

Spero che questo aiuti, i migliori saluti, Tom.

In UNIX, c'è il pratico glob funzione:

glob_t results;
memset(&results, 0, sizeof(results));
glob("*.txt", 0, NULL, &results);
for (i = 0; i < results.gl_pathc; i++)
    printf("%s\n", results.gl_pathv[i]);
globfree(&results);

Su Linux o di un sistema correlato, è possibile utilizzare la libreria FTS. E 'progettato per attraversare le gerarchie di file: uomo fts ,

o anche qualcosa di semplice come readdir

Se su Windows, è possibile utilizzare il loro Directory Gestione API. Più specificamente, la funzione FindFirstFile , usato con jolly in combinato disposto con FindNextFile

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top