Pregunta

Sólo tenía una pregunta general sobre la forma de abordar un determinado problema que estoy enfrentando. Soy bastante nuevo a C, de manera oso conmigo aquí. Decir que tengo una carpeta con más de 1000 archivos de texto, los archivos no se nombran en cualquier tipo de orden numerado, pero son alfabético. Por mi problema que tengo los archivos de datos de stock, cada archivo tiene el nombre de respectivos ticker de la compañía. Quiero escribir un programa que se abrirá cada archivo, los datos leídos encontrar el mínimo histórico y lo comparan con el precio actual y calcular el porcentaje de cambio, y luego imprimirlo. La búsqueda y el cálculo no son un problema, el problema es conseguir el programa para ir a través y abrir cada archivo. La única manera que puedo ver para atacar esto es crear un archivo de texto que contiene todos los símbolos de cotización, teniendo el programa de leer que en una matriz y luego ejecutar un bucle que se abre por primera vez el primer nombre de archivo en la matriz, realizar los cálculos, imprimir la salida, cierre el archivo, a continuación, de nuevo bucle alrededor de mover al segundo elemento (el siguiente símbolo) en la matriz. Esto sería bastante fácil de configurar (creo) pero me gusta mucho para evitar tener que escribir a cabo más de mil nombres de archivo en un archivo de texto. ¿Hay una mejor manera de abordar esto? En realidad, no pidiendo código (a menos que haya alguna función en C increíble que hará esto para mí;).), Sólo algunos consejos de los programadores más experimentados C

Gracias:)

Edit: Esto es en Linux, lo siento, se olvidó de mencionar al que

!
¿Fue útil?

Solución

En Linux / Unix (BSD, OS X, POSIX, etc.) que puede utilizar opendir / readdir que pasar por la estructura de directorios. No hay necesidad de generar archivos estáticos que necesitan ser actualizados, cuando el sistema de archivos tiene la información que desea. Si sólo desea un sub-conjunto de las acciones en un momento dado, a continuación, utilizando pegote sería más rápido, también hay scandir .

No sé lo que Win32 (Windows / SDK de la plataforma) se llaman funciones, si está desarrollando utilizando Visual C ++ como su compilador C. Buscando de MSDN debe ayudarle.

Otros consejos

Si se asume que se está ejecutando en Linux ...

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

es exactamente lo que quiere.

No hay funciones en C estándar que tienen alguna noción de un "directorio". Usted tendrá que utilizar algún tipo de función de plataforma específica para hacer esto. Para algunos ejemplos, echar un vistazo a este post de Cprogrammnig.com .

Personalmente, prefiero utilizar el enfoque opendir() / readdir() como se muestra en el segundo ejemplo. Funciona de forma nativa en Linux y en Windows si está utilizando Cygwin.

Enfoque 1) que sólo tendría un directorio específico en el que sólo tengo estos archivos que contienen los datos de cotización y nada más. Me continuación, utilizar el C readdir API para listar todos los archivos en el directorio e iterar sobre cada uno realizando el procesamiento de los datos que necesita. ¿Qué ticker el archivo se aplica a está determinada sólo por el nombre de archivo.

Pros: Fácil de código

Contras:. Realmente depende de dónde se almacenan los archivos y de dónde vienen?

Enfoque 2) Cambiar el formato de archivo para los archivos de teletipo comienzan con un código mágico identificar que se trata de un archivo de pizarra, y una cadena que contiene el nombre. Como antes de su uso readdir iterar a través de todos los archivos de la carpeta y abrir cada archivo, asegúrese de que el número mágico se establece y se lee la clave de pizarra desde el archivo, y procesar los datos como antes

Pros: Más flexible que antes. Nombre de archivo no necesita reflejar el nombre de la clave de pizarra   Contras:. Más difícil de código, formato de archivo puede ser fijo

  

pero me gusta mucho para evitar tener que escribir a cabo más de mil nombres de archivo en un archivo de texto. ¿Hay una mejor manera de abordar esto?

Me han resuelto el mismo problema hace un tiempo, aunque para el uso personal:)

Lo que hice fue usar los comandos de shell del sistema operativo para generar una lista de esos ficheros y redirigir la salida a un archivo de texto y tenía mi ejecución del programa a través de ellos.

En el pseudo código se vería como esto, no puede definir el código ya que no estoy 100% seguro de si este es el enfoque correcto ...

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

podría variar ligeramente si lo desea, escanear los nombres de archivo en las entradas de directorio y ordenarlos por primera vez por la construcción de un registro con los nombres de archivo en primer lugar, a continuación, volver al inicio de la lista / matriz y abrir cada uno lectura individual del los datos y ponerlo en el registro entonces ....

Espero que esta ayuda, atentamente, Tom.

En UNIX, está el pegote función útil:

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

En Linux o un sistema relacionado, se podría utilizar la biblioteca de FTS. Está diseñado para las jerarquías de archivos de desplazamiento: hombre FTS ,

o incluso algo tan simple como readdir

Si en Windows, puede usar su de administración de directorios API de . Más específicamente, la función FindFirstFile , utilizado con comodines, en conjunción con FindNextFile

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top