Frage

hat nur eine allgemeine Frage, wie ein bestimmtes Problem zu nähern, ich bin vor. Ich bin ziemlich neu in C so Bär mit mir hier. Sagen, dass ich einen Ordner mit 1000+ Textdateien haben, werden die Dateien nicht in jeder Art von nummerierten Reihenfolge genannt, aber sie sind alphabetisch. Ich habe Dateien von Bestandsdaten für mein Problem, jede Datei, nachdem das Unternehmens der jeweiligen Ticker gestattet. Ich möchte ein Programm schreiben, die jede Datei öffnen, lesen Sie die Daten, die die historischen Tiefststand finden und vergleichen Sie es mit dem aktuellen Preis und berechnen Sie die prozentuale Veränderung, und dann drucken. Suchen und Berechnung ist kein Problem, das Programm das Problem zu durchlaufen, wird immer und jede Datei zu öffnen. Der einzige Weg, diese zum Angriff sehen kann, ist eine Textdatei, die alle den Ticker-Symbole erzeugen enthält, wobei das Programm aufweist gelesen, dass in einem Array und dann in eine Schleife ausgeführt, dass zuerst der erste Dateinamen in der Anordnung geöffnet wird, führen die Berechnungen, Druck die Ausgabe, die Datei zu schließen, dann die Schleife zurück um (das nächste Ticker-Symbol) in der Anordnung mit dem zweiten Elemente zu bewegen. Dies wäre recht einfach einzurichten (glaube ich), aber ich würde wirklich wie über tausend Dateinamen in eine Textdatei eingeben, um zu vermeiden. Gibt es einen besseren Weg, dies zu nähern? Nicht wirklich für Code zu fragen (es sei denn, dass eine erstaunliche Funktion in c ist, dass dies für mich tun;).), Um nur einige Ratschläge von erfahrenen C-Programmierer

Danke:)

Edit: Das ist auf Linux, leider habe ich vergessen zu metion dass

!
War es hilfreich?

Lösung

Unter Linux / Unix (BSD, OS X, POSIX, etc.) können Sie verwenden opendir / readdir der Verzeichnisstruktur durchlaufen. Keine Notwendigkeit zu erzeugen statische Dateien, dass Bedarf aktualisiert werden, wenn das Dateisystem die gewünschten Informationen hat. Wenn Sie nur eine Teilmenge von Aktien zu einem bestimmten Zeitpunkt wollen, dann mit glob wäre schneller, gibt es auch scandir .

Ich weiß nicht, was Win32 (Windows / Platform SDK) Funktionen aufgerufen werden, wenn Sie die Entwicklung verwenden Visual C ++ als C-Compiler. Suche MSDN Library sollten Ihnen helfen.

Andere Tipps

Unter der Annahme, Sie laufen auf Linux ...

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

ist genau das, was Sie wollen.

Es sind keine Funktionen in Standard-C, die jede Vorstellung von einem „Verzeichnis“ haben. Sie müssen eine Art von Plattform-spezifische Funktion verwenden, um dies zu tun. Für einige Beispiele, werfen Sie einen Blick auf diesen Beitrag von Cprogrammnig.com .

Ich persönlich lieber mit dem opendir() / readdir() Ansatz wie im zweiten Beispiel gezeigt. Es funktioniert nativ unter Linux und auch auf Windows, wenn Sie Cygwin verwenden.

Ansatz 1) hätte ich nur ein bestimmtes Verzeichnis, in dem ich nur haben diese Dateien die Ticker-Daten und sonst nichts enthält. Ich würde dann die C readdir API verwenden, um alle Dateien im Verzeichnis aufgelistet und Iterierte über jede der Datenverarbeitung durchgeführt wird, dass Sie benötigen. Welche Ticker gilt die Datei nur durch den Dateinamen bestimmt wird.

Vorteile: Einfacher Code

Nachteile:. Es hängt wirklich davon, wo die Dateien gespeichert sind und woher sie kommen

Ansatz 2) Ändern des Dateiformat, so dass die Ticker-Dateien beginnen mit einem magischen Codes zu identifizieren, dass dies eine Ticker-Datei ist, und eine Zeichenfolge, die den Namen enthält. Wie vor dem Gebrauch readdir iterieren über alle Dateien im Ordner und jede Datei öffnen, stellen Sie sicher, dass die magische Zahl gesetzt und den Ticker Namen aus der Datei gelesen, und die Daten nach wie vor

verarbeiten

Vorteile: Flexibler als zuvor. Dateiname muss nicht Namen Ticker reflektieren   Nachteile:. Harder Code, Dateiformat festgelegt werden kann,

  

, aber ich würde wirklich wie über tausend Dateinamen in eine Textdatei eingeben, um zu vermeiden. Gibt es einen besseren Weg, um diesen Ansatz?

Ich habe genau das gleiche Problem vor einiger Zeit gelöst, wenn auch für den persönlichen Gebrauch:)

Was ich tat, war die OS-Shell-Befehle zu verwenden, um eine Liste der Dateien zu erzeugen und umgeleitet die Ausgabe in eine Textdatei und hatte mein Programm durchlaufen sie.

In Pseudo-Code es so aussehen würde, kann ich den Code nicht definieren, da ich nicht 100% bin sicher, ob dies der richtige Ansatz ist ...

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

Man könnte es leicht variieren, wenn Sie möchten, scannen Sie die Dateinamen in den Verzeichniseinträgen und sortieren sie zuerst durch einen Datensatz mit den Dateinamen Bau zuerst, dann zu Beginn der Liste / Array zurück und öffnet jeweils einzeln das Lesen Daten und in den Datensatz setzt dann ....

Hope, das hilft, freundliche Grüße, Tom.

Unter UNIX gibt es die handliche glob Funktion:

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);

Unter Linux oder ein verwandtes System, könnten Sie die FTS-Bibliothek verwenden. Es ist für Verfahrgeschwindigkeit Dateihierachien entworfen: Mann fts

oder sogar etwas so einfaches wie readdir

Wenn auf Windows können Sie ihre verwenden Directory Management API. Genauer gesagt, die Findfirstfile Funktion, die verwendet wurden mit Platzhalter in Verbindung mit Findnextfile

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top