Question

juste eu une question générale sur la façon d'aborder un certain problème que je suis confronté. Je suis assez nouveau C pour garder avec moi ici. Dire que j'ai un dossier avec des fichiers texte de 1000, les fichiers ne sont pas nommés dans un ordre quelconque numéro, mais ils sont alphabétique. Pour mon problème, j'ai des fichiers de données de stock, chaque fichier est nommé d'après ticker respectif de la société. Je veux écrire un programme qui ouvrira ses portes chaque fichier, lire les données trouver le plus bas historique et le comparer au prix actuel et calculer la variation de pour cent, puis l'imprimer. La recherche et le calcul ne sont pas un problème, le problème est d'obtenir le programme pour passer et ouvrir chaque fichier. La seule façon que je peux voir d'attaquer est de créer un fichier texte contenant tous les symboles boursiers, ayant le programme lu que dans un tableau, puis exécutez une boucle qui ouvre d'abord le premier nom de fichier dans le tableau, effectuez les calculs, l'impression la sortie, fermer le fichier, puis la boucle de retour autour de déplacement du deuxième élément (le prochain symbole) dans le tableau. Ce serait assez simple à mettre en place (je pense) mais je voudrais vraiment éviter de taper sur plus d'un millier noms de fichiers dans un fichier texte. Y at-il une meilleure façon d'aborder ce sujet? Pas vraiment demander le code (à moins d'une fonction étonnante dans c qui va le faire pour moi;).), Juste quelques conseils de programmeurs C plus expérimentés

Merci:)

Edit: ceci est sur Linux, désolé j'ai oublié de Métion que

Était-ce utile?

La solution

Sous Linux / Unix (BSD, OS X, POSIX, etc.), vous pouvez utiliser opendir / readdir pour passer par la structure de répertoire. Pas besoin de générer des fichiers statiques qui doivent être mis à jour, lorsque le système de fichiers a les informations que vous souhaitez. Si vous voulez seulement un sous-ensemble des stocks à un moment donné, puis en utilisant glob serait plus rapide, il y a aussi scandir .

Je ne sais pas quelles fonctions Win32 (Windows / Platform SDK) sont appelés, si vous développez en utilisant Visual C ++ comme compilateur C. Recherche MSDN Library devrait vous aider.

Autres conseils

En supposant que vous utilisez sur linux ...

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

est exactement ce que vous voulez.

Il n'y a pas de fonctions dans la norme C qui ont une idée d'un « répertoire ». Vous aurez besoin d'utiliser une sorte de fonction spécifique à la plateforme pour le faire. Pour quelques exemples, jetez un oeil à ce poste de Cprogrammnig.com .

Personnellement, je préfère utiliser l'approche opendir() / readdir() comme indiqué dans le second exemple. Il fonctionne nativement sous Linux et également sous Windows si vous utilisez Cygwin.

Approche 1) Je voudrais juste avoir un répertoire spécifique dans lequel je n'ai que ces fichiers contenant les données ticker et rien d'autre. Je voudrais ensuite utiliser la C readdir API pour lister tous les fichiers dans le répertoire et itérer sur chacun effectuant le traitement des données dont vous avez besoin. Ce qui Ticker le fichier s'applique à est déterminée uniquement par le nom du fichier.

Avantages: Facile à code

Inconvénients:. Cela dépend vraiment où les fichiers sont stockés et d'où ils viennent

Approche 2) Modifiez le format de fichier pour les fichiers ticker commencent par un code magique que c'est d'identifier un fichier symbole, et une chaîne contenant le nom. Comme avant l'utilisation readdir à itérer tous les fichiers dans le dossier et ouvrir chaque fichier, assurez-vous que le nombre magique est défini et lu le nom du symbole du fichier, et de traiter les données comme avant

Plus: plus souple qu'auparavant. Nom du fichier ne doit pas refléter le nom du symbole   Moins:. Plus difficile à code, le format de fichier peut être fixé

  

mais je voudrais vraiment éviter de taper sur plus d'un millier noms de fichiers dans un fichier texte. Y at-il une meilleure façon d'aborder ce sujet?

Je l'ai résolu le même problème un certain temps, mais pour son usage personnel:)

Ce que je faisais était d'utiliser le shell OS commandes pour générer une liste de ces fichiers et rediriger la sortie vers un fichier texte et avait mon programme géré par eux.

Dans le code pseudo, il ressemblerait à ceci, je ne peux pas définir le code que je ne suis pas 100% sûr que ce soit la bonne approche ...

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

Vous pouvez varier légèrement si vous le souhaitez, analyser les noms de fichiers dans les entrées du répertoire et les trier d'abord par la construction d'un enregistrement avec les noms de fichiers, puis revenir au début de la liste / tableau et ouvrir chacun à lire individuellement la données et de le mettre dans le dossier alors ....

Hope this helps, meilleures salutations, Tom.

Sous UNIX, il y a le rel="nofollow pratique glob fonction:

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

Sur Linux ou un système connexe, vous pouvez utiliser la bibliothèque fts. Il est conçu pour traverser des hiérarchies de fichiers: FTS homme

ou même quelque chose d'aussi simple que readdir

Si sous Windows, vous pouvez utiliser leur Gestion d'annuaire API. Plus précisément, la fonction FindFirstFile , utilisé avec des caractères génériques, en liaison avec FindNextFile

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top