fopen varios archivos

ruben
13 de Abril del 2010
Hola.

Soy nuevo por aquí en cuánto a pedir ayuda pero sin embargo muchos ejemplos y respuestas me han solucionado otras muchas dudas que he tenido.

Comento mi problema. Tengo el siguiente código con el que abro un archivo de texto cualquiera y me lo lee y dice el número de caracteres y otras características que tiene. Pero lo que quiero hacer y no consigo es abrir varios archivos que se llamen igual pero poniéndole una numeración, es decir, en este caso mi archivo se llama prueba.htm, y lo que quiero es que me lea 10 archivos distintos y que me guarde las características de cada uno de ellos (prueba1.htm, prueba2.htm, ...). Lo he probado con un bucle for pero me da problemas. ¿Me podríais dar algún consejo?

Muchas gracias.

Un saludo


#include <stdio.h>
#include <stdlib.h>

int separador (int x)
{
return (x==' ') || (x=='t') || (x=='n');
}

int main ()
{
long contador_caracteres;
long contador_palabras;
long contador_lineas;
long contador_espacios;
long contador_total;
long contador_comas;
long contador_puntos;
long contador_vocales;
long contador_consonantes;
long contador_otros;
FILE *nombre;
int c;
int actual;
int prev;

// Inicialización de los contadores

contador_total = -2;
contador_espacios = 0;
contador_caracteres = 0;
contador_comas = 0;
contador_puntos = 0;
contador_vocales = 0;
contador_consonantes = 0;
contador_palabras = -1;
contador_lineas = 0;
contador_otros = 0;

// Lectura de los datos de entrada

nombre = fopen("prueba.htm", "r");
prev = ' ';

if (nombre == NULL)

{
printf("El archivo no existe n");
exit (EXIT_FAILURE);
}

else

{

while (c != EOF)

{
c = getc(nombre); /* Obtiene un caracter del archivo */
putchar(c); /* Lo despliega en pantalla y continua... */

contador_total++;

// Espacios en blanco

if (c==' ')
contador_espacios++;

// Comas

if (c==',')
contador_comas++;

// Puntos

if (c=='.')
contador_puntos++;

// ¿Fin de línea?

if (c=='n')
contador_lineas++;

// Vocales

if (c=='a' || c=='A' || c=='á' || c=='e' || c=='E' || c=='é'|| c=='i' || c=='I' || c=='í' || c=='o' || c=='O' || c=='ó'|| c=='u' || c=='U' || c=='ú')
contador_vocales++;

// Consonantes

if (c=='b' || c=='B' || c=='c' || c=='C' || c=='d' || c=='D' || c=='f' || c=='F' || c=='g' || c=='G' || c=='h' || c=='H' || c=='j' || c=='J' || c=='k' || c=='K' || c=='l' || c=='L' || c=='m' || c=='M' || c=='n' || c=='N' || c=='p' || c=='P' || c=='q' || c=='Q' || c=='r' || c=='R' || c=='s' || c=='S' || c=='t' || c=='T' || c=='v' || c=='V' || c=='w' || c=='W' || c=='x' || c=='X' || c=='y' || c=='Y' || c=='z' || c=='Z')
contador_consonantes++;

// ¿Comienzo de una nueva palabra?

if (!separador(c) && separador(prev))
contador_palabras++;

// Siguiente carácter

prev = c;

}


fclose(nombre);

contador_caracteres=contador_total-contador_espacios;
contador_otros=contador_caracteres-contador_vocales-contador_consonantes-contador_comas-contador_puntos;

// Resultado

printf("n%ld caracteres totalesnn", contador_total);
printf("%ld caracteres sin espaciosn", contador_caracteres);
printf("%ld espacios en blanconn", contador_espacios);
printf("%ld comasn", contador_comas);
printf("%ld puntosn", contador_puntos);
printf("%ld vocalesn", contador_vocales);
printf("%ld consonantesn", contador_consonantes);
printf("%ld otros caracteresnn", contador_otros);
printf("%ld palabrasn", contador_palabras);
printf("%ld líneasn", contador_lineas);


return 0;

}
}

trasgu
13 de Abril del 2010
-Prueba esto:

#include <string.h>
//...
FILE *nombre;
char archivo[50];
char n[2];
int contador;
for(contador=0;contador<10;contador++){//prueba0.htm, prueba1.htm, ... a prueba9.htm
strncpy(archivo,"prueba",7);//copia a archivo
n[1]='';
n[0]=contador+'0';
strncat(archivo,(const char*)n,2);//añade a archivo
strncat(archivo,".htm",5);
nombre = fopen(archivo,"r");
if (nombre == NULL){
printf("El archivo no existe n");
exit (EXIT_FAILURE);
}
else{
fclose(nombre);
}
}

ruben
13 de Abril del 2010
Antes de nada trasgu, muchas gracias por preocuparte, la verdad es q sólo con tu respuesta ya me ha servido algo de ayuda.
te comento, he adaptado tu solución a mi código y lo q me sale es lo mismo q tenía anteriormente. creo q soy un poco malo explicándome, jeje.
t voy a decir el código completo q quiero hacer para ver si así me explico un poco mejor y me puedes echar una mano. tengo varios artículos distintos y quiero ver la diferencia existentes entre ellos, para ello he creado el programa anterior q mandé q lo q hace es poner las características de sólo un artículo. mi intención es ver como se van modificando esos 10 artículos para así saber si varían mucho o poco. para ello pretendía hacer una matriz q explicase el número de caracteres q tiene cada uno de ellos pero q se vean todos al ejecutarlo. no sé si con ésto t he aclarado o te he enredado más, jeje. si puedes echarme otra mano t lo agradecería porque la verdad es q estoy atascado.

de toas formas, muchas gracias por todo.

Un saludo

trasgu
13 de Abril del 2010
-Para declarar una matriz de 10x10 elementos:
long contadores[10][10];
-dentro del primer corchete iría el número de elemento (0-9), dentro del segundo corchete el valor de cada contador (0-9)
-para hacer referencia por ejemplo al 2º elemento y al 3º contador y sumarle uno sería así:
contadores[1][2]++;

ruben
13 de Abril del 2010
muchas gracias por la ayuda

Capitan Kirk
13 de Abril del 2010
Prueba con esto:

char nombreArchivo[50]; // O el tamaño que necesites
int i;

for (i=1; i<numArchivos; i++)
{
sprintf(numbreArchivo, "Prueba%d.ext", i); /ext es la extension que quieras aplicar
//
// Aqui viene el codigo para procesar el archivo...
//
}

Esto te generará los nombres Prueba1.ext, Prueba2.ext, etc.

Espero que te sirva de ayuda.

Saludos,

ruben
13 de Abril del 2010
Muchas gracias x la contestación Capitan Kirk, pero x lo q he visto no soy muy bueno explicándome porque otro compañero tampoco lo ha entendido. tendré q mejorar mi lenguaje, jeje. he dejao escrito lo q pretendo hacer con mi código x si quieres y puedes echarle un vistazo. Aún así muchas gracias por todo, espero q con lo escrito ahora puedas ayudarme.

Un saludo