2010-02-26 6 views
2

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 donc supporter avec moi ici. Dire que j'ai un dossier avec plus de 1000 fichiers texte, les fichiers ne sont pas nommés dans n'importe quel ordre numéroté, mais ils sont alphabétiques. Pour mon problème, j'ai des fichiers de données de stock, chaque fichier est nommé d'après le ticker respectif de l'entreprise. Je veux écrire un programme qui va ouvrir chaque fichier, lire les données trouver le bas historique et le comparer au prix actuel et calculer le pourcentage de changement, puis l'imprimer. La recherche et le calcul ne sont pas un problème, le problème est de faire passer le programme et d'ouvrir chaque fichier. La seule façon que je peux voir pour attaquer ceci est de créer un fichier texte contenant tous les symboles de ticker, le programme lisant cela dans un tableau puis exécutant une boucle qui ouvre d'abord le premier nom de fichier dans le tableau, effectuer les calculs, imprimer En sortie, fermez le fichier, puis rebouclez en vous déplaçant vers le second élément (le prochain symbole) dans le tableau. Ce serait assez simple à mettre en place (je pense) mais j'aimerais vraiment éviter de taper plus d'un millier de noms de fichiers dans un fichier texte. Y a-t-il une meilleure façon d'aborder cela? Pas vraiment demander de code (à moins qu'il y ait une fonction étonnante dans c qui le fera pour moi;)), juste quelques conseils de programmeurs C plus expérimentés.C - Lire plusieurs fichiers

Merci :)

Edit: Ceci est sous Linux, désolé j'ai oublié de Métion ça!

+2

Windows linux? Cela dépend du système. –

+0

Si vous utilisiez C++, vous pouvez utiliser la bibliothèque boost Filesystem pour effectuer une itération sur chaque élément d'un répertoire, étant donné le chemin du répertoire. – Kache

+0

+1 Veuillez reformater votre question correctement la prochaine fois :). C'est plus facile à comprendre. –

Répondre

4

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 ont besoin d'être mis à jour, lorsque le système de fichiers a l'information que vous voulez. Si vous voulez seulement un sous-ensemble de stocks à un moment donné, alors en utilisant glob serait plus rapide, il y a aussi scandir. Je ne sais pas quelles fonctions Win32 (Windows/Platform SDK) sont appelées, si vous développez en utilisant Visual C++ en tant que votre compilateur C. Retour au début | Envoyer des commentaires Plus d'informations Plus d'informations La recherche MSDN Library devrait vous aider.

+1

Dans l'API Win32, 'FindFirstFile' (ou' FindFirstFileEx')/'FindNextFile' /' FindClose'. – ephemient

+0

Merci pour les informations Win32. – mctylr

2

En supposant que vous utilisez sur linux ...

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

est exactement ce que vous voulez.

+1

Sous Windows: dir/b> names.txt –

0

Approche 1) Je voudrais juste avoir un répertoire spécifique dans lequel j'ai SEULEMENT ces fichiers contenant les données de ticker et rien d'autre. J'utiliserais ensuite le C readdir API pour lister tous les fichiers du répertoire et parcourir tous ceux qui effectuent le traitement de données dont vous avez besoin. Le ticker auquel le fichier s'applique est déterminé uniquement par le nom du fichier.

Avantages: facile à coder

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

Approche 2) Changez le format de fichier de sorte que les fichiers ticker commencent par un code magique identifiant qu'il s'agit d'un fichier ticker, et une chaîne contenant le nom. Readdir pour parcourir tous les fichiers du dossier et ouvrir chaque fichier, s'assurer que le nombre magique est défini et lire le nom du téléscripteur et traiter les données comme auparavant

Points forts: Plus flexible qu'auparavant. Le nom de fichier ne doit pas refléter le nom du téléscripteur Inconvénients: Plus difficile à coder, le format de fichier peut être corrigé.

+1

'readdir' n'est pas une API C, c'est une API POSIX. Le CRT de Microsoft pour Windows n'a pas ces fonctions. – ephemient

0

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

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

Ce que j'ai faite a été d'utiliser le shell OS commandes pour générer une liste de ces fichiers et redirigés vers la sortie à un fichier texte et a eu mon programme à travers eux.

0

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 le modifier légèrement si vous le souhaitez, scannez les noms de fichiers dans les entrées du répertoire et triez-les d'abord par bui lding un enregistrement avec les noms de fichiers d'abord, puis revenez au début de la liste/tableau et ouvrez chacun individuellement en lisant les données et en le mettant dans le dossier puis ....

Espérons que cela aide, meilleures salutations, Tom.

0

Sous UNIX, il y a la fonction glob pratique:

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

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

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

Si sous Windows, vous pouvez utiliser leur API Directory Management de. Plus précisément, la fonction FindFirstFile, utilisée avec les caractères génériques, en conjonction avec FindNextFile

1

Aucune fonction de la norme C n'a de notion de "répertoire". Vous devrez utiliser une sorte de fonction spécifique à la plate-forme pour ce faire. Pour quelques exemples, jetez un oeil à this post from Cprogrammnig.com.

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

Questions connexes